Botmap memo temp

Botmap memo temp for Dayz

#
-


#
-


#
-


#
-


#
-


#
-


#
-


#
-


#
Как пользоваться мастерской


#
1. (скрин1) Заходим в мастерскую и в разделе сайт выбираем нужную миссию и нажимаем 1 раз загрузить.
2. (скрин2) Заходим в раздел загрузить и выбираем "другие"
3. (скрин2) Выбираем например раздел юнит или интеллект и что то еще и нажимаем открыть - мы попадаем в папку автора и нам нужно загрузить все от этого автора
4. (скрин3) Загружаем в клиент все от этого автора проходится по каждой ячейки и нажимаем загрузить
5. (скрин4) все загруженные будут появляться слева
6. (скрин5) кроме сетов и диалогов они появляются в своих разделах так как они не отмечаются на карте.
7. (скрин6) Все объекты что на карте при загрузки скрыты для выделения, нужно через шифт выделить 1 и последнюю с лева и нажать 1 раз на красный значок и они будут сразу выделены на карте и могут быть передвинуты через зажатие левой кнопки мыши(зажать 2 секунды и отпустить)
8. В описании будет инструкция Dayz как запустить правильно эвент
9. Юниты, сеты, триггеры и тд не могут на прямую взаимодействовать между разными авторами, проще говоря триггер автора1 не может быть удален триггер автора2, но есть исключение, если объект физически на сервере Dayz как юнит, контейнер или лут, его может удалить любой так как объект это осязаемый объект, как и боты могут убивать ботов другого автора.
10. Автора можно изменить, а точнее сделать копию, изменив поле автор и нажав сохранить, чтоб удалить что то из другого автора, нужно зайти в раздел загрузки и нажать "удалить" только так можно удалить что то безвозвратно.


#
-


#
-


#
[eng]
How to use the workshop
1. (screenshot1) We go to the workshop and in the site section select the desired mission and click download once.
2. (screen2) Go to the download section and select "other"
3.(screen2) For example, select the unit or intellect section and something else and click open - we get into the author's folder and we need to download everything from this author
4.(screen3) We load everything from this author into the client, go through each cell and click download
5.(screen4) all downloaded will appear on the left
6.(screen5) in addition to sets and dialogues, they appear in their sections, since they are not marked on the map.
7. (screen 6) All objects that are on the map are hidden for selection when loading, you need to select 1 and the last from the left through the shift and click 1 time on the red icon and they will be immediately selected on the map and can be moved by holding the left mouse button (hold down 2 seconds and release)
8. The description will contain instructions on how to run the event correctly


#
-


#








#
-


#
-


#
Принцип работы мода, что нужно понять чтоб с ботмап стало работать проще:
1. Есть 2 мода- клиентский и серверный.
а) Клиентский это настройка юнитов, триггеров, сетов и тд.
б) серверный это выполнение настроек сохраненных клиентом.
То есть пока вы не нажмете сохранить вся информация будет только на клиенте и нельзя заспавнить будет так как спавн делает сервер Dayz не клиент.
2. У главного администратор(тот который 1 в списке admin.txt) есть единственного права на 2 функции:
а) Заспавнить при старте сервера Dayz - то есть создание юнита, триггера, контейнера и тд при старте сервера.
б) Сменить автора и управлять файлами других авторов, эта функция полезна не только когда у вас много админов и чтоб они не трогали файлы друг друга но и на этом принципе работает мастерская.


#
-


#
-


#
-


#
-


#
-


#
-


#
Как сделать чоб бот взял лут с земли и положил его в контейнер
1. Создаем контейнер - запоминаем его класс - container_50
2. Создаем бота выставляем тип ходьбы "дойти до конца" так как у нас всего 2 понта будет (для 3 и больше можно любой тип использовать)
3. Создаем понит поднятия нужного лута с земли и помещение его в инвентарь.
4. Создаем поинт переноса лута из инвентаря в контейнер и вписываем его класс container_50
5. Готово.



Создаем, контейнер, тип, класс, container_, лута, земли, любой, можно, использовать, пт, нятия, нужного, инвентарь, инвентаря
Создаем, контейнер, тип, класс, container_, лута, земли, любой, можно, использовать, пт, нятия, нужного, инвентарь, инвентаря
Создаем, контейнер, тип, класс, container_, лута, земли, любой, можно, использовать, пт, нятия, нужного, инвентарь, инвентаря
Создаем, контейнер, тип, класс, container_, лута, земли, любой, можно, использовать, пт, нятия, нужного, инвентарь, инвентаря
Создаем, контейнер, тип, класс, container_, лута, земли, любой, можно, использовать, пт, нятия, нужного, инвентарь, инвентаря
Создаем, контейнер, тип, класс, container_, лута, земли, любой, можно, использовать, пт, нятия, нужного, инвентарь, инвентаря
#
How to make a bot take loot from the ground and put it in a container
Create a container - remember its class - container_50
We create a bot and set the type of walk to "reach the end" since we will only have 2 show-offs(for 3 or more, any type can be used)
We create a pony to pick up the desired loot from the ground and place it in inventory.
Create a point for transferring loot from the inventory to the container and enter its class container_50
Ready.



create, container, loot, its, container_, type, inventory, class, bot, pony, pick, used, any, can, desired
create, container, loot, its, container_, type, inventory, class, bot, pony, pick, used, any, can, desired
create, container, loot, its, container_, type, inventory, class, bot, pony, pick, used, any, can, desired
create, container, loot, its, container_, type, inventory, class, bot, pony, pick, used, any, can, desired
create, container, loot, its, container_, type, inventory, class, bot, pony, pick, used, any, can, desired
create, container, loot, its, container_, type, inventory, class, bot, pony, pick, used, any, can, desired
#
-


#
---------------------------------------------


#
-


#
-


#
-


#
Как отловить зажигание Roadflare фальш файера на земле

- в тригере
- - условие
- - - объекты - Roadflare
- - - анимация Burning 0
фальфаер должен быть на земле и гореть


#
Как отловить зажигание Roadflare фальшфайера в руках

- в триггере
- - условие
- - - Активировать на Player
- - - Предмет в инвентаре
- - - Отслеживания анимации
- - - Предметы - Roadflare
- - - Анимация предмета Burning 0


#
Галочки в триггере которые не нагружают сервер Dayz вообще так как отслеживаются на стороне клиента, можно ставить хоть 1000 хоть на 10 000 метров, нагрузка будет только когда сработает триггер только в момент срабатывания:
- Игрок:
- - Зашел
- - вышел
- - активный слот
- - предмет в инвентаре
- - анимация предмета
- - сдвинулся с места
- - метка

- Эвенты выполняются только когда событие случается так же не нагружают сервер Dayz пока не случится событие хоть 1000 хоть на 10 000 метров, нагрузка будет только сработает эвент для выполнения триггера
- - убил
- - умер
- - получил урон


#
Анимация для вертолета - топливо это "toplivo" если через триггер изменить её в обьекте вертолет верт снова будет заправленным
лучше сделать по принципу бесконечного триггера с задержкой в 30 минут
делаешь динамический триггер пишешь имя бота к кому привязать

повторное выполнение триггера 30 минут
условие "объекты внутри животные" - число 0
в другие действия объект, анимация объекта имя toplivo значение 100

а да у верта сделана такая иерархия если бот за штурвалом то 2 пилот не может управлять вертом
боту делаете бессмертие в верту в принципе лучше бы тоже...(через конфиг вертов)

и получаем не убиваемый верт такси


#
новые теги для "вызвать функцию"
target - как правило на кого выполняется триггер
parent - противоположный target - или если убийца target то parent убитый и на оборот и тд
child - если target это техника то child Это 1 пилот если нет то 2 пилот
hands - руки или target , или parent , или child
crewarray - массив всех кто в техники если техника target или parent или child
itemarray массив контейнера если лут target или parent или child или hands
это для отдельного выполнения функции мода
Botfunctions
Aifunctions

например
Botfunctions.Add_Mark_Server("kill",uid,"76561198197506368",1);
kill - имя метки
uid - айди того кто получает
"76561198197506368" - автор метки
1 - номер для метки

но надо знать UID того а значит надо выполнить перед меткой этот код

PlayerBase user = PlayerBase.Cast(child);
PlayerIdentity identity=user.GetIdentity();
string uid=identity.GetPlainId();


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


#
коэффициент точности работает по принципу увеличения разброса от точки попадания
то есть
точка грудь
далее идет формула
знак / - это деление
знак * - это умножение
offset_distance = (100 / offset) * (distance / maxDistance)
где
offset - число которое ты вводишь в поле коэффициент
distance - дистанция до цели
maxDistance - дистанция видимости

грубо говоря
offset = 6
distance = 100
maxDistance = 700
100 / 6 = 16
100 / 700 = 0.14
16 * 0.14 = 2 метра

далее идет рандом от -2 метров до +2 метров выбирается случайная точка и бот туда кладет пулю
есть шанс что будет 0 и тогда промаха не будет есть шанс что будет 10 раз -2 то всегда 1 точку - рандом штука случаноая 😄


#
для новой версии
for(int i=0;iвыкинуть всех игроков из транспорта - ловить транспорт через объект


#
-


#
-


#
Вызов еекспешена трейдер меню
ExpansionTraderObjectBase trader = ExpansionMarketModule.GetTraderFromObject(bot);
ExpansionMarketModule.s_Instance.StartTrading(trader, user.GetIdentity());


#
Botfunctions.Inject_AI(target,"bot1","76561197991576958"); - сделать нпс ботом
Botfunctions.Unload_AI(target); - убрать из нпс бота
объект SurvivorBase


#
как сделать чтоб бот ходил когда ты в него вселился
1. вселяешься в бота
2. выполняешь target.PlayerSelectedsib=true;
3. выполнишь назначить интеллект
пока только ходить может - анимацию бота ты не видишь бот не может стрелять
но если выбрать призрака бота и включить вид от 3-го лица то мы получаем аналог камеры которая как по рельсам едет
для съемок роликов как вариант


#
По гранатам
пишем в функции
spawn.OnActivatedByItem(spawn); взорвется сразу в момент спавна (в других действиях в объектах указываем любую гранату даже дымовую)
target.OnActivatedByItem(target); если нужно через кондицию в объектах включить гранаты разбросанные уже


#
учитывайте что target должен быть PlayerBase а значит если будет ошибка то нужно перед таргетом сделать
PlayerBase user_target = PlayerBase.Cast(target); и использовать user_target

Сменить группу бота на стимайди игрока тем самым сделать его главным и боты будут следовать за ним
target.Bot_Editor_SetGroupLeader("76561198197506368");


#
Назначить игроку группу бота где 111 это группа
target.SetGroupLeader("111");


#
target.ExitGroup(); - убрать у игрока группу бота, стандартная группа игрока это его стим айди


#
Пример триггера который через чат спавнит что нужно админу

1 в триггере включаем текстовые сообщения на частичное совпадение

в вызов функции пишем

PlayerBase user = PlayerBase.Cast(target);PlayerIdentity identity=user.GetIdentity();string uid=identity.GetPlainId();if(uid=="76561197991576958"){GetGame().CreateObjectEx(text_array[1], target.GetPosition(), ECE_PLACE_ON_SURFACE);}

когда юзер со стим айди 76561197991576958 пишет в чат
spawn svd под ногами у него появляется svd
вариаций много но 1 из примернов такой


#
в голосовых сетах работает:
умер
получил урон
получил урон от союзника
убегает от врага
ранил врага
ранил или убил врага
вступил в группу
покинул группу
сменился интеллект
услышал шум


#
PlayerBase user_target = PlayerBase.Cast(target);user_target .SetGroupLeader("111");

PlayerBase user_target = PlayerBase.Cast(target);user_target.ExitGroup();


#
-


#
-


#
Для стройки - чтоб были все детали или для спавна авто с деталями

в разделе объект пишем класс
Fence - стена
Watchtower - вышка
ShelterSite - шалаш
в ввозов функции пишем
spawn.OnDebugSpawn();


#
-


#
-


#
Нюансы трейдера
1. боту нужен диалог и галочка торговля
2 контейнер в который он складывает и берет лут (контейнер именной)
3 в диалогах вызов меню торговли и имя трейд меню

по меню
цена покупки - это цена с которой игрок покупает лут
цена продажи - цена с которой игрок продает лут(покупку ставьте чуть выше чем продажу) коэффициента нет и он не нужен
урон покупки - урон продажи - это уровень повреждения с которым бот может купить или продать лут
лимит покуки - лимит продажи - нужен для 2 параметров - ну чтоб бот не покупал лута много одного типа
и 2 это связан с лимит коэффициент - это проценты
суть его в том что если поставить
цену 100 за акм
лимит 5
коэффициент 50 -
то 1 товар он купит и продаст по 100
2 товар по 90
3 по 80
4 по 70
5 по 60

то есть цена будет и на покупку и на продажу падать до того процента(но не включительно его)

если поставить 0% кооф лимита то
последняя цена будет соизмерима "почти бесплатно"
а 100% отключит уменьшение цены
на продажу работает так же

если у бота 1 акм а цена стоит 100 то он продаст его по 100
но если у бота 2 акм а лимит например 5 с кооф лимитом 0%
он продаст его по 80 а если 5 акмов у бота то 1 он продаст по цене 20, 2 по 40, 3 по 60, 4 по 80 а 5 по 100



по, це, он, то, лимит, даст, меню, бота, дажи, не, дажу, акм, нн, лут, коэффициент
#
еще нюанс по ценам
1. можно использовать базовый классы для цены - если akm_base поставить цену то все акамы будут иметь цену это и не надо для каждого писать цену
2. цена, кооф, лимиты связаны с кнопкой "адд сел" "адд бай" и влияет сразу на весь товар в списке то есть если вы хотите в поиске указать bottl то в списке появятся вся вода(она може быть в разном базовом классе так что 1 вариант не пригодится) и когда вы нажимаете адд сел или бай то все из списика добавиться с указанной ценой и условиями по урону и лимитам - это способ оч быстро добавить кучу цен на однотипные шмотки например которые имеют разные базовые классы
3 поиск по типу - если поставить галочку и указать например akm он покажет все классы этого базового класса но нужно писать именно akm_base чтоб он нашел такой базовый класс и показал все его подклассы



то, классы, цену, адд, по, он, писать, бай, указать, вы, списке, не, мер, сел, базовый
то, классы, цену, адд, по, он, писать, бай, указать, вы, списке, не, мер, сел, базовый
#
пока 2 меню торговли но буду "ретекстуры" в теме ретекстур где можно будет двигать их менять местами и картинки свои ставить - добавлю инструкцию



местами, менять, их, картинки, свои, инструкцию, добавлю, ставить, двигать, будет, но, торговли, меню, буду, ретекстуры
местами, менять, их, картинки, свои, инструкцию, добавлю, ставить, двигать, будет, но, торговли, меню, буду, ретекстуры
#
SurvivorBase - в обьекты - чтоб по кд срабатывало на всех игроков в триггере


#
радиусе 200 метров все зомби бежать к таргету
в вызов функции пишем строку:

NoiseSystem m_noise = GetGame().GetNoiseSystem();ref NoiseParams m_NoisePar = new NoiseParams();m_NoisePar.LoadFromPath("cfgAmmo RGD5Grenade_Ammo NoiseExplosion");m_noise.AddNoiseTarget(target.GetPosition(),10,m_NoisePar,1.0);


#
Определить что на игроке наручники
слот - руки
предмет HandcuffsLocked


#
Порядок наследования в скриптах кассов

class Object extends IEntity
class ObjectTyped extends Object
class Entity extends ObjectTyped
class EntityAI extends Entity
class Man extends EntityAI
class Human extends Man
class DayZPlayer extends Human
class DayZPlayerImplement extends DayZPlayer
class ManBase extends DayZPlayerImplement
class PlayerBase extends ManBase
class PlayerBaseClient extends PlayerBase
class SurvivorBase extends PlayerBaseClient

- Inventory_Base - базовый класс всего лута, он же базовый класс для воды
- - Edible_Base - базовый класс воды в банках
- - Bottle_Base - - базовый класс воды в бутылках
- RifleCore - базовый класс ружей и автоматов
- DefaultMagazine - базовый класс магазинов и патрон
- PistolCore - для пистолетов базовый класс
- LauncherCore - для подствольного вооружения


#
Способ сменить таргета через вызов функций

trigger.m_InheritTrigger_temp=parent;


#
-


#
в вызове функции
GetGame().ObjectDelete(child);

удаляет объект по условию триггера "предмет в инвентаре"


#
Таргет становится владельцем заспанненого контейнера он же класс spawn в триггере
Botfunctions.SetTraider_Container_Guid(spawn,target.GetIdentity().GetPlainId());
...
target.GetIdentity().GetPlainId() - это получение стим айди
spawn - это сам контейнер так как если прописать контйенер в других действиях он автоматом в класс spawn перекидывается для вызова функций


#
Botfunctions.MoveItemAll(otkda,kuda,typeName,count,typeAction,slot_otkuda,slot_kuda)
otkda - агент откуда брать лут
kuda - агент куда кидать
typeName - класс лута который нужно перекинуть, например "akm" или ""
count - колличество лута сколько кидать, если нужен весь ставьте больше.
typeAction - тип перекидывания - 0 - это лут в месте с лутом в нутри например куртки, 1 весь лут отдельно.
slot_otkuda - слот лута откуда брать, например слот рюкзака на игроке
slot_kuda - слот лута куда кидать


#
GetMoveItemAll(otkda,typeName,typeAction,slot) - выдает количество лута у контейнера любого
otkda -агент контейнера
typeName - тип лута например "akm"
typeAction - не нужно, значение 0
slot- если нужен конкретный слот, если нет то ""


#
как через вызов функций разблокировать слот у стройки

Fence fence = Fence.Cast( target );fence.GetInventory().SetSlotLock( InventorySlots.GetSlotIdFromString("Att_CombinationLock"), false );

условие объект Fence


#
Если в вызове функций написать

trigger.m_spawn_trigger=false;
то триггер не будет спавнить новый триггер если его обернуть в иф то это получиться аналог кондиции

вообще любые действия с триггером в вызове функций это
trigger. и что то
например получить координату триггера в логах
Print("pos trigger "+trigger.GetPositionTrigger());
или
trigger.m_delete_trigger=false;
чтоб триггер себя не удалял


#
"Head","Shoulder","Melee","Headgear","Mask","Eyewear","Hands","LeftHand","Gloves","Armband","Vest","Body","Back","Hips","Legs","Feet","Splint_Right"
имена слотов


#
в триггере

$profile:/BotMap_sib/base/111.json


куда файл класть(папку создать можно любую да и место в приципе любое)
DayZServer2\instance_dayzserver\BotMap_sib\base\111.json


#
удалить и переместить обьект HouseNoDestruct


#
удалить здание
GetDayZGame().GetSuppressedObjectManagerTemp().Suppress(target);

восстановить после рестарта(но вроде как не до конца на сервере Dayz надо его спавнить)
GetDayZGame().GetSuppressedObjectManagerTemp().Unsupress(target);


#
через вызов функций запрещает триггеру спавнить следующий триггер
trigger.m_spawn_trigger=false;
через вызов функции запрещает читать поле удалить триггер
trigger.m_delete_trigger=false;

Как проверять включена ли рация, фальшфаер да и любой предмет который можно включить

условие активный слот, предмет и имя класса, в вызове функции

if(child.GetCompEM().IsSwitchedOn()==false)trigger.m_spawn_trigger=false;

и в других действиях заспавнить триггер
если предмет в нужном слоте не включен то триггер сработает но не заспавнит следующий

child это как parent или trigger только более редкое отлавливание, в данном случаи
триггер - это игрок
перента - нет
а child - это рация


#
чтобы получить номер волны используем
child.GetTunedFrequency().ToString()
пример будет
91.3


#
AI_FUNCTIONS.ChangeBodyCopy_Test(parent.GetIdentity(),parent,target);
вселится в бота
где
parent - это тело в котором сейчас находишься
target - тело в которое хочешь вселится


#
Ключи для тестовых меток в триггер и диалог

{target} - агент таргет
{target_class} - класс таргета
{target_hands}- класс объекта в руках таргета
{target_uid}- стимАйди таргета


{parent} - агент перент
{parent_class} - класс перент
{parent_hands}- класс объекта в руках перента
{parent_uid}- стимАйди перента


#
включить фонарик в руках бота

поинт1, взять в руки, из инвентаря flashlight
поинт2 задержка 2 секунды
вызов функций
hands.OnWorkStart();



поинт, секунды, flashlight, задержка, вызов, hsonworkstart, функций, инвентаря, из, руках, форик, бота, взять, руки, включить
#
включить налобный фонарик headtorch_grey

через триггер
условие бот, предмет в инвентаре, предмет headtorch_grey
вызов функций
child.OnWorkStart();

батарейка не обязательна
(так работает и с фонариком, только класс подставляй ну и child это объект который указан в предметах можно и с радио и чем угодно главное правильную функцию найти)



headtorch_grey, объект, крый, child, ну, ставляй, указан, класс, можно, функцию, йти, правильную, главное, только, угодно
#
target.PhysicsEnableGravity(false);
- выключить гравитацию ты бегаешь без учета высоты земли с горки бежишь прямо а не в низ (нельзя прыгать)
target.PhysicsEnableGravity(true);
- включить

dBodyApplyImpulse(target, "0 1000 0");
- подкидывает на 3 метра в верх


#
target.Synchronize();
синхронизация таргета
spawn.Synchronize();
после телепорта


#
как получить лут с игрока и перевести в массив
string data_client = Botfunctions.Bot_Editor_SavePlayer_Text_SIB(target);
создаем бота такого же
PlayerBase clon= GetGame().CreateObject(target.GetType(), target.GetPosition(),false,true,true );
создаем ему лут с игрока
clon= Botfunctions.Bot_Editor_LoadTextPlayers_SIB_edit(data_client ,user);


ну и делаешь этого персонажа ботом

Botfunctions.Inject_AI(clon,"bot1","76561197991576958");
сменить на группу игрока
clon.SetGroup(target.GetIdentity().GetPlainId());
clon.Bot_Editor_SetGroupLeader(target.GetIdentity().GetPlainId());


#
if(Math.RandomInt(0, 100) != 0)trigger.m_spawn_trigger=false;
запрещает спавнить триггер с вероятностью 99% то есть рандом от 0 до 99 знаков(в итоге 100 знаков) при выполнении триггера
выдает какую та цифры и пока она не будет 0(в принципе любое число можно в приделах диапазона)

так же может работать с параметром
trigger.m_delete_trigger=false; - запрещает читать поле "удалить триггер" после выполнения с шансом 99%
if(Math.RandomInt(0, 100) != 0)trigger.m_spawn_trigger=false;


#
Как вызвать дождь
Weather weather = g_Game.GetWeather();
weather.GetRain().Set( 1, 120, 120 );
1- мощность от 0.1 до 1
120 время