The New Future :: FOnline, Half-life 2 :: Roleplay It!  

Вернуться   The New Future :: FOnline, Half-life 2 :: Roleplay It! > Прочее > FOmod > Учебка

Учебка Обучающие материалы.

Ответ
 
Опции темы Опции просмотра
Старый 27.03.2010, 16:15   #1
binyan
Senior Member
 
Специализация: Вне команды
Регистрация: 09.02.2010
Сообщений: 339
Вес репутации: 171
binyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant future
По умолчанию Скрипты FAQ

Актуальность: 05/09/2010

На повестке дня (вопросы без ответов)

Пытался сделать мьют плеера, но сообщения всеравно появляются,может не тот ивент использую?
Скрытый текст:

Код:
void PlMute(Critter& player, int param0, int param1, int param2) //critter, mute type,, null
{
  Critter @ cr = GetCritter(param0);
  switch(param1)
  {
    case 0: cr.SetEvent(CRITTER_EVENT_MESSAGE, ""); break;
    case 1: cr.SetEvent(CRITTER_EVENT_MESSAGE, "e_MuteAll");break;
  }
}

void e_MuteAll(Critter& cr, Critter& fromCr, int message, int value)
{
}


Перехват обработчика выбрасывания вещей на глобальной карте...
Пытался сделать так:

Скрытый текст:

main.fos
Код:


void map_critter_in(Map& map, Critter& cr)
{
	cr.Say(SAY_NETMSG, "in");
	cr.SetEvent(CRITTER_EVENT_DROP_ITEM, "");
	...

}

void map_critter_out(Map& map, Critter& cr)
{
  cr.Say(SAY_NETMSG, "out");
  cr.SetEvent(CRITTER_EVENT_DROP_ITEM, "e_DropItemOnGlobal");
  
}

void e_DropItemOnGlobal(Critter& cr, Item& item)
{
...
}

На карте мира срабатывает стандартный обработчик.
Собственно понятно что нужно использовать что-то другое, вопрос что?


Как получить тип атаки\повреждений? Как получить режим атаки?

Как узнать количество кадров в анимации итема\криттера\сценери?

Как оборвать анимацию на определенном кадре? В функции Animate есть только номер первого кадра. Чего-то вроде числа проигрываемых кадров или номера последнего кадра я не встречал.


Можно ли добавить поле в уже существующий класс через скрипты. Добавить, например, в Critter переменную bool IsMoving, чтобы ее можно было чекать из других скриптов. Как-нибудь в main.fos можно что-то подобное прописать?


Общие вопросы


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

И что планируется реализовывать скриптами.
Обработка глобала. Итемы-Сценери в планах - для интерактивности карты. Кэширование в клиенте.

Где можно почитать мануал по Angel Script?
Здесь

Какие разделы следует читать первым делом?
Использование и Синтаксис

Где взять мануал по скриптам ФО?
Вложение Scripting 23.02.2010.zip (Пока не прикрепил актуальную версию, скоро сделаю).


Вопросы по настройке Notepad++


Где можно достать последние версии файлов подсветки (fo.xml) и автозаполнения (userDefineLang.xml) для НПП(notepad++) ?
Вложение Notepad++ Integration. Там же лежит инструкция по интеграции скриптов НПП.

Настроил все по инструкции, а компайлер пишет вот такую фигню:
Код:
Unable to preprocess. Errors:
_macros.fos (0) Error : Could not open file _macros.fos
Что делать?

Положить папку со скриптами на один диск с Notepad++

Не создается файл препроцессора. Что делать?
Перед путем к файлу поставить ключик -р.
Пример рабочего батника:
Код:
cd %2

call E:\Scripting\ASCompiler\ASCompiler.exe %1 as.dll fo.dll -p E:\Scripting\prep.txt 

pause
Вопросы непосредственно по скриптам

События которые привязываются через SetEvent. Перекрывают оригинальные обработчики или нет?
Не перекрывают. Сначала выполняется функция привязанная через SetEvent затем глобальный обработчик.

Как полностью перехватить обработчик? Например, если я хочу чтоб при атаке криттера он выполнял определенные действия и НЕ выполнял действия по умолчанию.
С помощью импорта обработчика из main.fos. Информация непроверенная (насколько я знаю не все глобальные обработчики там прописаны)

Как можно сделать криттера невидимым на время?
Невидимым никак. Но можно создать видимость невидимости. Либо удалять его из игры с помощью функции DeleteNpcForce (Функции API сервера), а затем добавлять его с обратно с помощью функции AddNpc (класс Map), либо переносить его на время за пределы видимости с помощью функции TransitToHex (класс Critter), а затем возвращать обратно.

Как изменить процент поломки/износа айтема?
import void SetWear(Item& item, int wearProcent) from "repair";

Переменные Identifier и IdentifierExt в NpcPlane. Что это такое и для чего они существуют? Как они используются в дальнейшем? Можно ли им присваивать любое значение или существует какой то список, и значения должны быть последовательными?
Идентификатор плана, дополнительный идентификатор.
Специального назначения у этих параметров нет (движком не используются, насколько известно). Могут использоваться для поиска конкретного плана среди всех планов НПЦ.

Critter::GetPlanesByExt(uint identifierExt, NpcPlane@[]@+ planes)
Critter::GetPlanes(int identifier, uint identifierExt, NpcPlane@[]@+ planes)


Как работать со временем и таймерами, в двух словах?
Скрытый текст:

Для работой со временем используются функции скрипта time.fos
uint GetNearFullMinute(uint16 year, uint16 month, uint16 day, uint16 hour, uint16 minute) - возвращает ближайшую игровую минуту будушего по заданным критериям
GetNearFullMinute(0,0,12,0,0) - вернет ноль часов ноль минут 12 числа ближайшего месяца, например.
Также там есть функции для строчного представления игрового времени (месяц, год, день итд)
Глобальная функция uint GetFullMinute(year,month,day,hour,minute) - возвращает игровую минуту(точные дату и время) по заданным параметрам
Также широко используются переменные времени __FullMinute(текущая игровая минута), __FullHour и т.д.


Таймер может быть условным или реальным. Реальный таймер - это временное событие, которое сработает в указанную игровую минуту (CreateTimeEvent(...)), в аргументах события можно передавать все, что угодно.

Условный - в диалогах удобно использовать, например, - это когда в некую переменную или поле сохраняешь контрольную дату/время (в игровых минутах), а потом сверяешься с этой переменной.
Например uint nextTime = __FullMinute+60; (Следующее время - ровно через игровой час, после текущей минуты) и последующие проверки: if(__FullMinute>nextTime) значит время наступило.


Как можно вызывать определённую функцию раз в, например, 10 секунд до выполнения определённых условий?
Скрытый текст:

Ну здесь можно выбирать. Если функция срабатывает в контексте некоей игровой карты - очень удобно использовать событие MAP_LOOP у Map. Частотой лупа можно управлять с помощью функции map.SetLoopTime()

В общем случае можно использовать временные события



Код:

CreateTimeEvent(_FullMinute+_TimeMultiplier/6,"e_Every10Sec",true);
uint e_Every10Sec( uint[]@ values )  
{
	if(условие сработало)
	{
		return 0; //возврат 0 удаляет эвент
	}else{
		Вызов функции
		return _TimeMultiplier/6; // еще 10 сек
	}
}


Если игрока окружает группа нпц, то стоящие вне этой группы не могут найти путь к игроку и у них, судя по всему, сбрасывается AttackPlane. Как с этим можно элегантно справиться?
Здесь возможен миллион решений. Можно отогнать одного из нпц, загораживающих проход, можно подождать какоето время,
отменить атаку и возобновить при смерти кого-то в радиусе видимости, или движении игрока, итд.
Но вроде как отмены плана атаки в таком случае не должно быть - он просто откладывается в выполнении. Можно посмотреть в основных скриптах планов нпц (main_planes.fos) - функция bool npc_plane_end() - блок для reason==REASON_GAG_CRITTER

Как скриптово изменить цвет кружочка локации на глобале?
Location::Color

Чтобы корректно указать цвет - имеет смысл использовать
#import "_colors.fos"

Где в скриптах есть (и есть ли) наглядный образец скриптово создаваемого графического интерфейса (открытие окошка с кнопочками и т.д.)? Обработки нажатий кнопок клавиатуры/мышки?
Примеры использования интерфейсных функций можно посмотреть в следующих скриптах: client_main, client_gui, client_screen_test


Есть ли какой-то метод переноса предметов с карты на карту, не создавая новый итем?
Скрытый текст:

Код:
void MoveItems  ( Item@[]&  items, Map&  toMap, uint16  toHx, uint16 toHy)

Перемещает предметы в передаваемом массиве на карту.

Аргументы:
 items 	Массив перемещаемых предметов.
 toMap 	Карта, на которую должны быть перемещены предметы.
 toHx,toHy 	Координаты гексагона карты, на который следует
                переместить предметы.

См. также:
    Item::SpecialId 
    MoveItem(Item&, uint, Map&, uint16, uint16)

Как определить что на карту зашел первый игрок\там никого нет\количество игроков:
Скрытый текст:

Сделаем функцию инициализации карты и добавим туда:

Код:
map.SetEvent(MAP_EVENT_IN_CRITTER, "_critterIn");
map.SetEvent(MAP_EVENT_OUT_CRITTER, "_critterOut");
Потом создадим еще две функции:

Код:
void _critterIn(Map& map, Critter& cr)
{
 if(map.GetData(MAP_PLAYERS_COUNT) == 0)
 {

   некие действия;
 }
 
 if(map.GetData(MAP_PLAYERS_COUNT) >= 0)
 {
  map.SetData(MAP_PLAYERS_COUNT, map.GetData(MAP_PLAYERS_COUNT) + 1);
 }
} 
Код:
void _critterOut(Map& map, Critter& cr)
{
if(map.GetData(MAP_PLAYERS_COUNT) > 0)
 {
  map.SetData(MAP_PLAYERS_COUNT, map.GetData(MAP_PLAYERS_COUNT) - 1);
 }
if(map.GetData(MAP_PLAYERS_COUNT) == 0)
 {
   некие действия;
 }
} 
Примечание:
На статичных картах сбивается, потому как при сохранении мира счетчик тоже сохраняется. Поэтому такой способ подходит только для энкаунтеров.


Если просто нужно проверить, есть ли на карте игроки, проще всего:

Код:
map.SetEvent(MAP_EVENT_IN_CRITTER, "_critterIn");

Код:
void _critterIn(Map& map, Critter& cr)
{
 if(map.GetCritters(0, FIND_ALL|FIND_ONLY_PLAYERS, null)==1)
 {
   // на карте никого нет, кроме того, кто сейчас зашел
 }
} 

Есть ли какой-нибудь способ проверить двигается ли криттер в данный момент? Я нашел только насчет бега - IsRunning
Напрямую проверить это нельзя, вроде. В большинстве случаев достаточно использовать Critter::IsNoPlanes() - если у криттера нет никаких планов, очевидно, он стоит на месте. Иначе можно анализировать текущий план криттера Critter::IsCurPlane(AI_PLANE_WALK)
Для игрока такой способ не подходит.

Как обнулить эллемент items[], пробовал просто записывать null и в items[i].ChangeProto(null). Сервер ругается.

Обнулять нужно не обьект, а указатель:

Код:
@items[i] = null

2. if (_CritGetItemHand(crt).GetType()==ITEM_WEAPON)
Почему то проверка не срабатывает... Script exception: Null pointer access


Нету итема в руке, поэтому нельзя вызвать метод экземпляра.

Код:
Item @ item = _CritGetItemHand(crt);
if(valid(item))
if(item.GetType()==ITEM_WEAPON)
Как правильно пользоваться методом SetScript?
Код:
SetScript("ИмяСкрипта@ИмяИнитФункции");
Как узнать какой из слотов активен: 1 или 2?
Слот 1 - это активный слот. Он активен всегда. При смене оружия не меняется не активный слот, просто предмет в активном слоте и в неактивном слоте взаимозаменяются.
Вложения
Тип файла: zip NPP.zip (64.0 Кб, 56 просмотров)

Последний раз редактировалось binyan; 18.01.2011 в 17:53.
binyan вне форума   Ответить с цитированием
Данный человек сказал спасибо binyan за этот пост:
Лорд (05.09.2010)
Старый 02.05.2010, 17:00   #2
Denergar
Senior Member
 
Аватар для Denergar
 
Регистрация: 05.10.2009
Сообщений: 247
Вес репутации: 138
Denergar has much to be proud ofDenergar has much to be proud ofDenergar has much to be proud ofDenergar has much to be proud ofDenergar has much to be proud ofDenergar has much to be proud ofDenergar has much to be proud ofDenergar has much to be proud of
По умолчанию

Пока отпостю сюда:

Цитата:
[14:52:03] <Denergar> Привет, Цвет. У меня тут несколько вопросов возникло, надеюсь сможешь помочь. 1. Можно ли сделать более чем 3 варианта атаки? Если да, то как? 2. Можно ли на варианты атак ставить условие в виде требуемого перка? Если да, то как? 3. Можно ли для каждого оружия ставить опред. кол-во ОД, требуемых на перезарядку? Если да, то как? Или это всё закопано в движке?
[14:53:54] <cvet> С помощью смены прототипа оружия в нужный момент, время перезарядки пока нельзя менять.
[14:54:49] <Denergar> А условие в виде перка?
[14:55:59] <cvet> В тот момент, когда меняется прототип, тогда и делаются проверки.
[14:56:12] <Denergar> Спасибо.
[14:56:53] <cvet> В зависимости от условий ставится нужный прототип оружия, в момент взятия оружия в руку, например.
А теперь по-русски :3

Последний раз редактировалось Denergar; 02.05.2010 в 17:03.
Denergar вне форума   Ответить с цитированием
Старый 04.05.2010, 20:24   #3
Denergar
Senior Member
 
Аватар для Denergar
 
Регистрация: 05.10.2009
Сообщений: 247
Вес репутации: 138
Denergar has much to be proud ofDenergar has much to be proud ofDenergar has much to be proud ofDenergar has much to be proud ofDenergar has much to be proud ofDenergar has much to be proud ofDenergar has much to be proud ofDenergar has much to be proud of
По умолчанию

Прицельные очереди.
Цитата:
[18:07:47] <Denergar> Цвет, привет. Я попытался добавить прицельные очереди для оружия - не вышло. Анимация проходит, сама атака - нет. Это происходит потому что нету формул и скриптов просчитывающих это всё дело?
[18:09:01] <cvet> Я не знаю что ты добовлял и что не вышло, раз на публичных серверах работает, то значит должно работать.
[18:09:29] <Denergar> Прицельная очередь.
[18:09:44] <Denergar> Не одиночный выстрел.
[18:10:01] <Denergar> Ладно, сами будем копаться и искать. Спасибо.
[18:10:49] <cvet> Прицельная очередь запрещена.
[18:11:20] <cvet> Не помню сейчас где там проверки, в движке или скриптах.
[18:12:02] <Denergar> Хм... Если в движке, то короткие (3-4 патрона) прицельные очереди сделать не выйдет. Беда.
[18:12:39] <Denergar> Атома ещё спрошу, спасибо.
[18:12:53] <cvet> Для переноса функционала с движка в скрипты нужно делать заявку.
[18:13:49] <Denergar> Как накопится побольше - думаю будет иметь смысл кинуть. Много раз по мелочам копаться - напряжно.
Цитата:
It's prohibited by the engine, it can be workarounded by making changes in the combat script and/or global attack handler.

Это запрещено в движке, но это можно обойти с помощью изменений в комбат-скрипте и/или в общем обработчике атак.

Последний раз редактировалось Denergar; 05.05.2010 в 13:03.
Denergar вне форума   Ответить с цитированием
Данный человек сказал спасибо Denergar за этот пост:
heX (05.05.2010)
Старый 13.05.2010, 19:34   #4
binyan
Senior Member
 
Специализация: Вне команды
Регистрация: 09.02.2010
Сообщений: 339
Вес репутации: 171
binyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant future
По умолчанию

Опять слегка изменил структуру Фака. Для повышения читабельности большие блоки (вопросов или ответов) заключаются в тег hider. Отныне и впредь прошу учесть это при написании постов в этой теме.
binyan вне форума   Ответить с цитированием
Старый 25.05.2010, 01:25   #5
PowerMagic
Lost Overseer
 
Аватар для PowerMagic
 
Специализация: ест детей.
Регистрация: 29.01.2010
Сообщений: 1,000
Вес репутации: 571
PowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond repute
По умолчанию

небольшое обновление:
Код:
void RunClientScript (string&	 funcName,	int p0, int p1, int 	p2, string@+ p3,	int[]@+ p4)
если мы вдруг не захотим передавать p0,p1,p2,будет весело посылать нас нахуй, ругаться будет, пока не передадим хоть какие-то значения.
2Bin массив передается как массив, а не указатель на него.

как вернуть значения в аргументы функции

Код:
void MySuperFunc(uint8 input, uint8& output)
{
  output = input * 2;
}

void RunMyFunc( )
{
  uint8 testVar = 10;  
  MySuperFunc(10, testVar);
}
после выполнения МайСаперФанк, в тестВар будет записанно значение 20;
PowerMagic вне форума   Ответить с цитированием
Старый 25.05.2010, 03:54   #6
binyan
Senior Member
 
Специализация: Вне команды
Регистрация: 09.02.2010
Сообщений: 339
Вес репутации: 171
binyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant future
По умолчанию

Цитата:
Сообщение от PowerMagic Посмотреть сообщение
если мы вдруг не захотим передавать p0,p1,p2,будет весело посылать нас нахуй, ругаться будет, пока не передадим хоть какие-то значения.
Так что передавать то? Ноль?
binyan вне форума   Ответить с цитированием
Старый 25.05.2010, 05:08   #7
PowerMagic
Lost Overseer
 
Аватар для PowerMagic
 
Специализация: ест детей.
Регистрация: 29.01.2010
Сообщений: 1,000
Вес репутации: 571
PowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от binyan Посмотреть сообщение
Так что передавать то? Ноль?
так точно.

+вопрос, макрос SETFLAG не работает для ItemCl, есть другой способ установить флаг?
PowerMagic вне форума   Ответить с цитированием
Старый 25.05.2010, 07:05   #8
binyan
Senior Member
 
Специализация: Вне команды
Регистрация: 09.02.2010
Сообщений: 339
Вес репутации: 171
binyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant futurebinyan has a brilliant future
По умолчанию

Цитата:
Сообщение от PowerMagic Посмотреть сообщение
+вопрос, макрос SETFLAG не работает для ItemCl, есть другой способ установить флаг?
почему то я так и думал

ИМХО нет

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

Последний раз редактировалось binyan; 25.05.2010 в 07:13.
binyan вне форума   Ответить с цитированием
Старый 08.06.2010, 19:41   #9
heX
Senior Member
 
Специализация: Скриптер
Регистрация: 15.10.2009
Сообщений: 121
Вес репутации: 98
heX will become famous soon enough
По умолчанию

Меняю изображение у итема через смену кадра анимации. Выставляю анимацию "i.Animate(an,an);", но после потери видимости итем теряет эту анимацию и начинает показывать совсем не-то. Как быть?

Последний раз редактировалось heX; 09.06.2010 в 10:31.
heX вне форума   Ответить с цитированием
Данный пользователь сказал FFUU~~ heX за этот пост:
Fujhover (19.11.2010)
Старый 08.06.2010, 19:54   #10
PowerMagic
Lost Overseer
 
Аватар для PowerMagic
 
Специализация: ест детей.
Регистрация: 29.01.2010
Сообщений: 1,000
Вес репутации: 571
PowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond reputePowerMagic has a reputation beyond repute
По умолчанию

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

Код:
item.AnimStayBegin	= frm;
	item.AnimStayEnd	= frm;
	item.AnimShowBegin 	= frm;
	item.AnimShowEnd 	= frm;
	item.AnimHideBegin 	= frm;
	item.AnimHideEnd	= frm;
где frm номер кадра, хотя судя по Begin End можно и анимации так делать, но я не пробовал, только по кадру выдвал(использовал у деревьев для "генератора" карт).
PowerMagic вне форума   Ответить с цитированием
Данный человек сказал спасибо PowerMagic за этот пост:
heX (09.06.2010)
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 13:59.


Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot
Для внутреннего пользования