Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • Не хотите БАН?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок
  • Загляните на рынок

    Там вы можете продать или купить
    Всё что касается игровых серверов
BorizzK

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

Рекомендованные сообщения

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

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

 

Изменено пользователем BorizzK
добавлена пометка в названии темы (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Забронировать это рекламное место


зОдачко 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 соответствующую поверхности, но что это за функция сейчас не помнит... Может кто знает о чем речь

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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);

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

 

)))

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

NoNameUltima так про спавн речи и не идет

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

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

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

Изменено пользователем 123new (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Изменено пользователем NoNameUltima (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Кстати

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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 примере есть получение позиции)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо.

Очень полезно.

 

А говорил БРЕХНЯ )))

 

 

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

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();
  }
 }


 

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

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

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

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

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

 

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

убрал

Все ОК!

 

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


 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

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

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

 

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

 

 

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

костыль, да

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Похожие публикации

    • Автор: NoNameUltima
      Автор:
      Я. Версия админки:
      R3  
      Описание:
      Админка поставляется с ключами, и подписями. Админка разделена на 2 части - клиентская, и серверная. Так же работает в оффлайн режиме.  
      Для установки админки, необходимо:
      На сервере подключить серверный мод. На сервере подключить клиентский мод. На сервере скопировать ключ из клиентского мода, и поместить в папку keys сервера. На клиенте добавить клиентский мод. В конфигурационный файл администрации прописать UID(ы) администраторов и модераторов.  
      Рабочие пункты админки:
       
      Отображение в 3D(ESP от 0 до 1000м)
      Настройки радиуса отображения Игроки. Зомби. Техника. Постройки. Объекты.  
      Отображение на карте(в радиусе игрока от 0 до 1000м):
      Настройки радиуса отображения Игроки. Зомби. Техника. Постройки. Объекты. НПЦ.  
      Сервер:
      Установка времени на сервере. Установка погоды на сервере(В бете).  
      Собственные:
      Телепорт по векторам(4 - по направлению взгляда. 5 - вверх). Телепорт по карте. Неуязвимость. Бесконечный БК. Невидимость. Защита от зомби. Свободная камера.  
      Игроки:
      Телепорт игрока к администратору. Телепорт администратора к игроку. Телепорт в заданные координаты. Лечение. Очистка инвентаря. Выдача БК к текущему оружию(в руках). Заблокировать. Разблокировать. Убить. Отсоединить. Забанить(свой файл банов по UID) Создание перед игроком объектов из заранее подготовленных файлов на сервере. Игроки(доп.  пункты для мода Ultima):
      Изменить баланс наличных Изменить банковский баланс Изменить репутацию Изменить фракцию Изменить кол-во убийств зомби Изменить кол-во убийств людей  
      Создание объектов:
      Фильтр при выборе раздела создания предметов(поиск по имени класса). Пресеты для создания авто, из аддонов(авто с обвесом, - колеса и т.п., так же можно добавлять и для стандартной техники, если нет желания ее создавать в сборе).  
      Удаление объектов:
      Все все объекты в радиусе X(не более 100м). Все объекты в радиусе X, по классу(не более 100м). Объект в прицеле по горячей клавише.  
      Другое:
      Карта администратора. Монитор отладки. Информационный виджет. Наблюдение за игроком.  
      Горячие клавиши:
      [        -     Вызов панели администратора. HOME     -     Вкл\Выкл отображения полосы отладки. DELETE   -    Удаление объекта в прицеле. 4  -    Телепорт по направлению взгляда. 5  -    Телепорт вверх. SHIFT+M - Карта администратора. F11 - Дебаг администратора.  
      Сообщения:
      Вывод сообщений игрокам, о действиях модератора(если в админке UID указан, как UID модератора).  
      Журналы:
      Действия администрации.  
      Стоимость:
      3500  
      Видео:( ВНИМАНИЕ! В ВИДЕО, ВНУТРИ ПАНЕЛИ АДМИНИСТРАТОРА, РАБОТАЮТ ТОЛЬКО ТЕ ПУНКТЫ КОТОРЫЕ УКАЗАНЫ ВЫШЕ! ОСТАЛЬНЫЕ ПУНКТЫ ДОБАВЛЕНЫ НА БУДУЩЕЕ, И МОГУТ БЫТЬ ИЗМЕНЕНЫ)
      P.S. Обновления платные - 25% от стоимости админки.
      Скайп: hf-trade
    • Автор: NoNameUltima
      Скрипт для создания серверных зараженных зон.
       
      Автор Я.
       
      Стоимость: 1500.
       
      Контакт: Skype: hf-trade
       
      Для каждой зоны задается:
      Имя зоны(внутреннее) Сообщение которое будет получать игрок при входе в зону. Сообщение которое будет получать игрок при выходе из зоны. Центр зоны. Радиус. Уровень урона по игроку, при отсутствии комплекта защиты. Список комплектов. Частота урона в радиусе зоны. Урон по каждой вещи комплекта.  
      Описание работы:
      При входе в зону, скрипт каждые Х мс. проверяет наличие на игроке комплекта из списка доступных для данной зоны.
      Если ни одного комплекта не обнаружено, - наносит урон игроку.
      При обнаружении комплекта(первый встреченный по списку), урон наносится по комплекту(в соответствии с настройками, для каждой вещи).
       
      Пример конфигурации:
      Зона 1|Вы входите в зону 1|Вы покидаете зону 1|0 0 0|30|5|5000|GasMask:10+HuntingJacket_Brown:15-CombatBoots_Brown:5 Где:
      Зона 1                          -    Внутреннее имя зоны. Вы входите в зону 1    -    Сообщение которое получит игрок при входе в данную зону. Вы покидаете зону 1   -    Сообщение которое получит игрок при выходе из данной зоны. 0 0 0                             -    Координата центра зоны. Высота значения НЕ имеет. 30                                 -    Радиус зоны. 5                                   -    Урон по игроку в зоне(если на нем нет комплекта) 5000                             -    Частота проверки игроков в зоне(частота нанесения урона, по игроку, или комплекту) в МС. Комплекты:
      GasMask:10+HuntingJacket_Brown:15-CombatBoots_Brown:5 *В примере, два комплекта (разделение через тире).
      Через двоеточие - урон по данной вещи комплекта.
      Через плюс - вещи одного комплекта.
       
    • Автор: 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 мод. свои он пока просил не показывать

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

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
    • Автор: 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 игрока на сервере ваш файл с данными по игрокам будет присутствовать и заполняться информацией, а в случае их отсутствия удаляться.
    • Автор: 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, ну и работа кода прирывается.
      Понять не могу какова причина такого действия. Может кто просвятить что это за функция такая и по какой причине один раз эта функция обрабатывается как надо, а второй отказывается, и как должно быть? В родных скриптах сервера так ничего и не нашел поясняющего.
      Разумеется, передать в виде другой переменной значение в родную функцию не могу, т.к. мод оригинальный авторский.
×
×
  • Создать...