Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a theme in the appropriate section
    No need to write everything in the chat!
  • Sell or buy?

    Use the services of a guarantor
    We will make your transaction safe
  • Don't want a BAN?

    Please read our rules
    Don't disturb the order
  • Visit the market

    There you can sell or buy
    Everything related to game servers
BorizzK

DAYZ enScript (вопросы, ответы)

Recommended Posts

Предлагаю все возможные гайды по enscript/моддингу публиковать в этой теме

Ссылка на предыдущею версию темы по enscript версии 0.62 - там можно прочитать в общих чертах про этот язык

 

Edited by BorizzK
добавлена пометка в названии темы (see edit history)

Share this post


Link to post
Share on other sites





зОдачко 1
 

Телепортнуть игрока рядом с определенным предметом/игроком и тп

 

void ChangePos(vector pos)
{
ref array<Man> players = new array<Man>;
GetGame().GetPlayers( players );
vector teleport_pos;
PlayerBase iplayer;
for ( int i = 0; i < players.Count(); i++ )
{
teleport_pos[0] = pos[0] + 5;
teleport_pos[1] = 0;
teleport_pos[2] = pos[2] + 5;
Class.CastTo(iplayer, players.Get(i));
iplayer.SetPosition(teleport_pos);
}
}

 

ChangePos(предмет.GetPosition());


Игрок должен телепортнуться на расстоянии от самого предмета (+5м по оси X  + 5м по оси Y) и на поверхности, а он телепортится под землю если предмет лежит на горке.... Раньше если Z = 0 то это всегда означала поверхность...
Как сделать так что бы он на поверхности остался?
Мизев сказал, что была какая-то функция позволявшая по координатам X и Y найти координату Z соответствующую поверхности, но что это за функция сейчас не помнит... Может кто знает о чем речь

Share this post


Link to post
Share on other sites
16 минут назад, BorizzK сказал:

 была какая-то функция позволявшая по координатам X и Y найти координату Z соответствующую поверхности, но что это за функция сейчас не помнит... Может кто знает о чем речь

Брехня.(но если найдешь че - маякни. Я не нашел... пока что).

 

Из того что есть, но бесполезно

/*!
Get water ocean height at given point
\param worldX        world x position
\param worldZ        world z position
*/
proto native float GetOceanHeight(float worldX, float worldZ);


/*!
Get water ocean height and displacement at given point, returns vector(displaceX, height, displaceZ)
\param worldX        world x position
\param worldZ        world z position
*/
proto native vector GetOceanHeightAndDisplace(float worldX, float worldZ);

Share this post


Link to post
Share on other sites

Ну те телепортнуть однозначно на поверхность не получится пока...
Чтож пошел рыть

 

Кстати
вот include в init.c в корне миссии работает оказывается

 

#include "mpmissions\dayzOffline.chernarusplus\init_mod.c"

 

)))

 

 

Share this post


Link to post
Share on other sites

BorizzK инклюд как бэ везде работает. А почему не должен?

по поводу поверхности, хз... по идее - должно быть. Ну как то же спавнится техника\зомбы рандомно. Сомневаюсь, что там высота задана)

Share this post


Link to post
Share on other sites

NoNameUltima Спавнится, да. Но если SetPosition (5000,0,5000) то оказываешься на уровне моря
Хотя
Сейчас еще раз проверю

 

Share this post


Link to post
Share on other sites

BorizzK я про то, что возможность должна быть или спавнить с каким то аргументом - чтоб ось З была "на поверхности", ну или функция.

Share this post


Link to post
Share on other sites

BorizzK возвращаясь к тому, что писал в соседней теме, что я предлагаю:
1. Пишем функцию, чтения файла и записи данных в массив

2. Проверяем массив строк построчно, и ищем какие-либо значения в строках (например, tpto=). Если нашли, убираем контрольное слово, и оставляем в строке данные, которые передаем в следующую функцию

3. Третьей функцием обрабатываем аргументы. например, аргумент был "tpto=Dima,Gabriel", значит в функцию попало "Dima,Gabriel"

4. В соответствии с оставшимися данными в функции выполняем действие, например находим в списке игроков object персонажа в ником Dima и телепортируем его к Gabriel

5. Готово, операция выполнен, пишем в лог действие.
Муторно? Не спорю. Не удобно? Возможно. Но это хоть какой-то вариант посыла комманд серверу и операций над игроками.

Соответственно, список функций можно расширять.

Edited by 123new (see edit history)

Share this post


Link to post
Share on other sites

123new псдц. и зачем это?

Или ты про админку прогрммную не ИнГейм?

Ну так то можно, но... убого. Делал еще на А2 такое в DZEU был телепорт и т.п.

Edited by NoNameUltima (see edit history)

Share this post


Link to post
Share on other sites

Кстати

Надо присмотреться

Что и как создает менюху действия для пожрать, банку открыть и как резалт приходит на сервер...

Share this post


Link to post
Share on other sites

BorizzK 

vector SnapToGround(vector pos)
    {
        float pos_x = pos[0];
        float pos_z = pos[2];
        float pos_y = GetGame().SurfaceY(pos_x, pos_z);
        vector tmp_pos = Vector(pos_x, pos_y, pos_z);
        tmp_pos[1] = tmp_pos[1] + pos[1];
    
        return tmp_pos;
    }

 

или просто

item.PlaceOnSurface();

 

Это к твоему вопросу, - как на поверхность положить.(в 1 примере есть получение позиции)

Share this post


Link to post
Share on other sites

NoNameUltima BorizzK понятно что убого и ограниченно по действиям, но в любом случае это хоть что-то, хоть как-то управлять сервером.

Share this post


Link to post
Share on other sites

 

void TeleportToPos(vector pos, float distance) // Teleport all players to airdrop position on land + distance
 {
  ref array<Man> players = new array<Man>;
  GetGame().GetPlayers( players );
  vector teleport_pos;
  
  for ( int i = 0; i < players.Count(); i++ )
  {
   teleport_pos[0] = pos[0] + distance;
   teleport_pos[2] = pos[2] + distance;
   teleport_pos[1] = GetGame().SurfaceY(teleport_pos[0], teleport_pos[2]);
 
   PlayerBase iplayer;
   Class.CastTo(iplayer, players.Get(i));
   
   SendMessage("You are teleport to: " + teleport_pos.ToString());
   Print("Player " + iplayer.ToString () + " teleport to: " + teleport_pos.ToString());
   iplayer.SetPosition(teleport_pos);
   iplayer.PlaceOnSurface();
  }
 }


 

Ну и как бы начинаются дичайшие глюки

игроки бегают не по рельефу, а на высоте куда их поместило

оказались на горке и бежим к старому

так и бегаем над старым ))))

уверен, что это глюк движка...

 

 

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Share this post


Link to post
Share on other sites

iplayer.PlaceOnSurface(); тут лишнее (добавлял для теста)

 

убрал

Все ОК!

 

Одна задачка решена )))


 

 

Share this post


Link to post
Share on other sites

Ну что... Вроде как появился наконец лаунчер с возможностью автоматически скачивать необходимые для игры моды, при заходе на сервер. И вроде как инфа есть как автостартануть инит мода\аддона.

Можно вобщемто начинать делать гуи, и искать - как серв и клиент инфой обмениваются(собственные пакеты с данными).

Share this post


Link to post
Share on other sites

Есть паоа идей

Для реализации хочу понять

Где на стороне сервера в контексте и6рокао брабатывается 

Смерть игрока, аналог event_playerkilled

Нанесение урона, аналог event_assetdamage

Стрельба, аналог event_weaponfired

 

Кто подскажет?

 

 

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

BorizzK смерть на серверной стороне обрабатывается:
scripts\4_World\Entities\ManBase\PlayerBase.c
функция override void EEKilled( Object killer )
спасибо за наводку от Мизева. Думаю, именно ее надо крутить.

Share this post


Link to post
Share on other sites

BorizzK он там же и писал как можно определить принадлежность оружия к тому или иному объекту

Share this post


Link to post
Share on other sites

123new Ну да, получив обьект оружия, из которого убили, перебирам вокруг игроков с этим обьектом и получив нужного игрока назначаем его убийцей

костыль, да

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Similar Content

    • By BorizzK
      Дружбан ваяет тягач/грузовик и тп
      Он довольно большой и фургон/кузов загораживает обзор + ему надо было разглядеть подвеску в работе поподробней
      Те камеру надо было отодвинуть
      Поскольку бегемоты, то ли по глупости, то ли по скудоумию (скорее оба варианта ), в конфиге модели не предусмотрели таких параметров как
      дистанция камеры, углы ее наклона итд итп, а сделали это тупо в скрипте, пришлось моддидь.
       
      Вариант моддинга внешней (от 3го лица) камеры автомобильчика, как обычно через класс, но моддим конструктор (без override). Я не стал изобретать велосипед и поступил по "серверному"... Вроде получилось и все работает как надо. Зил кажет нормально, остальные то же.
       
      modded class DayZPlayerCamera3rdPersonVehicle extends DayZPlayerCameraBase { void DayZPlayerCamera3rdPersonVehicle (DayZPlayer pPlayer, HumanInputController pInput) { Print("CLIENT: КАМЕРА ДЛЯ ТОЧИЛЫ: ИГРОК: " + pPlayer.ToString() + ", ТОЧИЛА: " + pPlayer.GetCommand_Vehicle().GetTransport().GetType()); if (pPlayer.GetCommand_Vehicle().GetTransport().GetType() == "ZIL130") { m_fDistance = 8.0; //дистанция m_CameraOffsetMS = "0.0 1.3 0.0"; //стартовый наклон камеры Print("CLIENT: КАМЕРА ДЛЯ ТОЧИЛЫ: МОЯ КРУТАЯ ТОЧИЛА: ДИСТАНЦИЯ КАМЕРЫ: " + m_fDistance); return; } m_fDistance = 4.0; //стандартная дистанция m_CameraOffsetMS = "0.0 1.3 0.0"; //стартовый наклон камеры Print("CLIENT: КАМЕРА ДЛЯ ТОЧИЛЫ: СТАНДАРТНАЯ ТОЧИЛА: ДИСТАНЦИЯ КАМЕРЫ: " + m_fDistance); } }  
      Понятно что это для клиента (ну те для обычного мода) и на сервере бесполезно.
       
      Фото с тестового грузовика из АРМА 3 мод. свои он пока просил не показывать

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
    • By 123new
      Нам понадобится:
      1. Сервер DayZ Standalone (см. тему вот эту)
      2. Notepad++: бесплатно на оф. сайте
      3. Немного времени и настойчивости (обычно бывает в комплекте и так)
       
      И так, начинаем:
      1. Открываем блокнотом mpmissions\dayzOffline.chernarusplus\init.c
      P.S. Имя папки dayzOffline.chernarusplus у вас может отличаться, будьте внимательны
      2. В начале файла добавляем:
      static int time_repeat_info_players = 10; //in seconds static string file_name_info_players = "$profile:PlayersLogFile.txt"; static void WriteFile(string file_name, string text) { private FileHandle fhandle; if ( !FileExist(file_name) ) { fhandle = OpenFile(file_name, FileMode.WRITE); } else { fhandle = OpenFile(file_name, FileMode.APPEND); } if ( fhandle == 0 ) { Print("[#Запись_в_файл]: Не удалось открыть файл для записи: " + file_name); Print("[#Запись_в_файл]: [Запись]: " + text); return; } FPrintln(fhandle, text); CloseFile(fhandle); } static void WritePlayersInfo() { array<Man> players = new array<Man>; Man player; Man player_test; GetGame().GetPlayers( players ); if (players.Count() > 0) { if ( FileExist(file_name_info_players) ) { DeleteFile(file_name_info_players); } for ( int i = 0; i < players.Count(); ++i ) { player_test = players.Get(i); if( player_test ) { PlayerIdentity p_identity = player_test.GetIdentity(); private string coord_pl = player_test.GetPosition().ToString(); private string Name_P = p_identity.GetName(); private string UID_P = p_identity.GetPlainId(); WriteFile(file_name_info_players, "User name: " + Name_P + " UID: " + UID_P + " Coords: " + coord_pl); } } } else { if ( FileExist(file_name_info_players) ) { DeleteFile(file_name_info_players); } } } Где 'PlayersLogFile.txt' меняем на нужное вам имя файла, а в 'time_repeat_info_players' настраиваем время повтора проверки списка игроков для перезаписи файла
      3. Находим в файле блок 'void main()' и в его конце перед закрывающей '}', поумолчанию это строка
      weather.SetWindFunctionParams(0.1, 0.3, 50); добавляем ниже строку:
      GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(WritePlayersInfo, (time_repeat_info_players * 1000), true); 4. Готово, если не допустили ошибок, при наличии хотя бы 1 игрока на сервере ваш файл с данными по игрокам будет присутствовать и заполняться информацией, а в случае их отсутствия удаляться.
    • By 123new
      Возник вопрос нового плана.
      Есть в авторском моде функция
      void GlobalChat(CallType type, ref ParamsReadContext ctx, ref PlayerIdentity sender, ref Object target) { Param2< string, string > data; if ( !ctx.Read( data ) ) return; if( type == CallType.Server ) { string name = sender.GetName(); string steamid = sender.GetPlainId(); string bisid = sender.GetId(); string idtable = sender.GetPlayerId().ToString(); string log_date_time = ExpansionGetDateTime(); string format = "[" + log_date_time + "] " + "[Chat]" + " " + name + "(steamid=" + steamid + ", bisid=" + bisid + ") " + data.param2; GetGame().AdminLog(format); GetRPCManager().SendRPC( "DayZExpansion", "GlobalChatServer", new Param2< string, string >(data.param1, data.param2) ); } } Пишу в своем моде, который должен на стороне своего сервера ее дополнять через изменение имеющегося класса:
      override void GlobalChat(CallType type, ref ParamsReadContext ctx, ref PlayerIdentity sender, ref Object target) { Print("ctx " + ctx); ParamsReadContext ctx_tmp = ctx; super.GlobalChat(type, ctx, sender, target); MyLogsGlobalChat(type, ctx_tmp, sender, target); } void MyLogsGlobalChat(CallType type, ref ParamsReadContext ctx, ref PlayerIdentity sender, ref Object target) { Print("12345"); Print("ctx2 " + ctx); Param2< string, string > data; Print("data " + data); if ( !ctx.Read( data ) ) return; Print("1112131415"); Print("data.param1 " + data.param1); Print("data.param2 " + data.param2); if( type == CallType.Server ) { string name = sender.GetName(); string steamid = sender.GetPlainId(); string bisid = sender.GetId(); string idtable = sender.GetPlayerId().ToString(); string log_date_time = GetExpansionChatBase().ExpansionGetDateTime(); string format = "[" + log_date_time + "] " + "[Chat]" + " " + name + "(steamid=" + steamid + ", bisid=" + bisid + ") " + data.param2; Print(format); } } В логах после data NULL соответственно ничего не вижу.
      Если меняю местами
      Param2< string, string > data; Print("data " + data); и
      super.GlobalChat(type, ctx, sender, target); то ситуация обратная, то что мне надо выполняется, а сама оригинальная функция нет, т.к. ломается на таком же коде в оригинальной функции.
      Долгими вычислениями и тестами дошло, что ломается операция на строке
      if ( !ctx.Read( data ) ) return; в моем моде, которая вместо считывания данных в переменную возвращает false, ну и работа кода прирывается.
      Понять не могу какова причина такого действия. Может кто просвятить что это за функция такая и по какой причине один раз эта функция обрабатывается как надо, а второй отказывается, и как должно быть? В родных скриптах сервера так ничего и не нашел поясняющего.
      Разумеется, передать в виде другой переменной значение в родную функцию не могу, т.к. мод оригинальный авторский.
×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.