http://mod.worldofgothic.ru/Какие программы использовать для создания своих модов на Возвращение( если не тяжело киньте ссылку)
var int bodystate;
var string cT;
cT=ConcatStrings("BS: ",IntToString(Npc_GetBodyState(hero)));
//
if(Npc_GetBodyState(hero)==BS_HIT){
cT=ConcatStrings(cT,"BodyState is BS_HIT ");
};
//bodystate = (Npc_GetBodyState(hero) & (BS_MAX | BS_FLAG_INTERRUPTABLE | BS_FLAG_FREEHANDS));
if(Npc_GetBodyState(hero)==BS_AIMNEAR){
cT=ConcatStrings(cT,"\nBodyState is BS_AIMNEAR ");
};
//bodystate = (Npc_GetBodyState(hero) & (BS_MAX | BS_FLAG_INTERRUPTABLE | BS_FLAG_FREEHANDS));
if(Npc_GetBodyState(hero)==BS_AIMFAR){
cT=ConcatStrings(cT,"\nBodyState is BS_AIMFAR ");
};
if(Npc_GetBodyState(hero)==BS_ITEMINTERACT){
cT=ConcatStrings(cT,"\nBodyState is BS_ITEMINTERACT ");
};
if(Npc_GetBodyState(hero)==BS_MOBINTERACT){
cT=ConcatStrings(cT,"\nBodyState is BS_MOBINTERACT ");
};
if(Npc_GetBodyState(hero)==BS_MOBINTERACT_INTERRUPT){
cT=ConcatStrings(cT,"\nBodyState is BS_MOBINTERACT_INTERRUPT ");
};
if(Npc_GetBodyState(hero)==BS_DROPITEM){
cT=ConcatStrings(cT,"\nBodyState is BS_DROPITEM ");
};
if(Npc_GetBodyState(hero)==BS_THROWITEM){
cT=ConcatStrings(cT,"\nBodyState is BS_THROWITEM ");
};
if(Npc_GetBodyState(hero)==BS_CASTING){
cT=ConcatStrings(cT,"\nBodyState is BS_CASTING ");
};
if(Npc_GetBodyState(hero)==BS_CONTROLLING){
cT=ConcatStrings(cT,"\nBodyState is BS_CONTROLLING ");
};
print(cT);
if(C_BodyStateContains(hero,BS_HIT)){
cT=ConcatStrings(cT,"BodyState is BS_HIT ");
};
if(C_BodyStateContains(hero,BS_AIMNEAR)){
cT=ConcatStrings(cT,"\nBodyState is BS_AIMNEAR ");
};
if(C_BodyStateContains(hero,S_AIMFAR)){
cT=ConcatStrings(cT,"\nBodyState is BS_AIMFAR ");
};
if(C_BodyStateContains(hero,BS_ITEMINTERACT)){
cT=ConcatStrings(cT,"\nBodyState is BS_ITEMINTERACT ");
};
if(C_BodyStateContains(hero,BS_MOBINTERACT)){
cT=ConcatStrings(cT,"\nBodyState is BS_MOBINTERACT ");
};
if(C_BodyStateContains(hero,BS_MOBINTERACT_INTERRUPT)){
cT=ConcatStrings(cT,"\nBodyState is BS_MOBINTERACT_INTERRUPT ");
};
if(C_BodyStateContains(hero,BS_DROPITEM)){
cT=ConcatStrings(cT,"\nBodyState is BS_DROPITEM ");
};
if(C_BodyStateContains(hero,BS_THROWITEM)){
cT=ConcatStrings(cT,"\nBodyState is BS_THROWITEM ");
};
if(C_BodyStateContains(hero,BS_CASTING)){
cT=ConcatStrings(cT,"\nBodyState is BS_CASTING ");
};
if(C_BodyStateContains(hero,BS_CONTROLLING)){
cT=ConcatStrings(cT,"\nBodyState is BS_CONTROLLING ");
};
print(cT);
instance ItRw_Arrow(C_Item)
{
...
magic=arrowMagic; //(не используется)
on_state[0]=arrowOnStatZer;
on_state[1]=arrowOnStatOne;
on_state[2]=arrowOnStatTwo;
on_state[3]=arrowOnStatThr;//Функции вызываемые при использовании предмета по видам состояний (видов состояний не обнаружил ???)
};
instance ItRw_Sld_Bow(C_Item)
{
...
magic=bowMagic; //(не используется)
on_state[0]=bowOnStatZer;
on_state[1]=bowOnStatOne;
on_state[2]=bowOnStatTwo;
on_state[3]=bowOnStatThr;//Фун
};
func void arrowMagic()
{
Print("Arrow magic");
};
func void arrowOnStatZer(){
Print("Arrow on state Zero");
};
func void arrowOnStatOne(){
Print("Arrow on state One");
};
func void arrowOnStatTwo(){
Print("Arrow on state Two");
};
func void arrowOnStatThr(){
Print("Arrow on state Three");
};
func void bowMagic()
{
Print("Bow magic");
};
func void bowOnStatZer(){
Print("Bow on state Zero");
};
func void bowOnStatOne(){
Print("Bow on state One");
};
func void bowOnStatTwo(){
Print("Bow on state Two");
};
func void bowOnStatThr(){
Print("Bow on state Three");
};
func void QAmmo()//функция, отслеживающая изменение кол-ва стрел у ГГ
{
var int QArrows;
if Npc_IsInFightMode(hero,FMODE_FAR) == 1 //если ГГ находится в боевом режиме с оружием дальнего радиуса поражения
{
//следим за кол-вом стрел
if (QArrows == 0) && (Npc_HasItems(hero,ItRw_Arrow) > 0) //начальное значение надо записать. А если стрелы закончатся?
{
QArrows = Npc_HasItems(hero,ItRw_Arrow);
}
else
{
if (QArrows > Npc_HasItems(hero,ItRw_Arrow))//если стрел стало меньше
{
Print("Выстрел!");//произошёл выстрел
QArrows = Npc_HasItems(hero,ItRw_Arrow);//записываем новое значение стрел в переменную QArrows
};
};
};
};
func void ZS_SanUse()
{
};
func int ZS_SanUse_Loop()
{
QAmmo();
return LOOP_CONTINUE;
};
func void ZS_SanUse_End()
{
};
Ты не врубился=) Он имелл в виду КАК отследитьIce, первый вопрос - это выстрел из лука от кого? От главного персонажа или от всех окружающих его NPC?
Далее...
Не знаю, может быть это и хитро придумано, но можно попробовать так:
Но это отслеживание выстрела чисто от ГГ.
Вся фишка в том, чтобы отследить изменение кол-ва стрел(если надо, допиши болты или другие боеприпасы)
Код:
Код:func void QAmmo()//функция, отслеживающая изменение кол-ва стрел у ГГ { var int QArrows; if Npc_IsInFightMode(hero,FMODE_FAR) == 1 //если ГГ находится в боевом режиме с оружием дальнего радиуса поражения { //следим за кол-вом стрел if (QArrows == 0) && (Npc_HasItems(hero,ItRw_Arrow) > 0) //начальное значение надо записать. А если стрелы закончатся? { QArrows = Npc_HasItems(hero,ItRw_Arrow); } else { if (QArrows > Npc_HasItems(hero,ItRw_Arrow))//если стрел стало меньше { Print("Выстрел!");//произошёл выстрел QArrows = Npc_HasItems(hero,ItRw_Arrow);//записываем новое значение стрел в переменную QArrows }; }; }; };
Возможны баги и ошибки, т.к. функция не прошла теста.
Функцию надо вызывать из таймера(скрипт + триггер) или через обычный цикл, в котором находится НПС.
Пример:
Осталось ввести в цикл любого нпс и вставть его в локацию.Код:func void ZS_SanUse() { }; func int ZS_SanUse_Loop() { QAmmo(); return LOOP_CONTINUE; }; func void ZS_SanUse_End() { };
Эти состояния тела гг) допустим чем дольше целишсо, тем выше дамаг идет от Рейнж вепонаconst int BS_AIMNEAR = 24; //Близкая цель
const int BS_AIMFAR = 25; //Далекая цель
const int BS_HIT = 26 | BS_FLAG_INTERRUPTABLE; //Удар
//==========================================================================
// calcStaminaInFight()
//
// Определить расход выносливости в бою
// в зависимости от аттрибутов персонажа
//
func void calcStaminaInFight()
{
// Если ГГ в режиме боя любом то
if(Npc_IsInFightMode(hero,FMODE_NONE)!=TRUE)
{
// сразу вычесть из выносливости
ATR_STAMINA -= 1;
//если нанесён механический удар
if(C_BodyStateContains(hero,BS_HIT))
{
//ручным оружием
if(Npc_IsInFightMode(hero,FMODE_MELEE))
{
ATR_STAMINA -= getRequiredStamina(ATR_STRENGTH)*2;
}// иначе кулаком
else
{
ATR_STAMINA -= 3;
};
}// если дальнобой
else if(Npc_IsInFightMode(hero,FMODE_FAR))
{
//TODO и ГГ имеет цель
if(Npc_GetTarget(hero))
{
//и ГГ прицеливается
if(Npc_IsAiming(hero,other))
{
// вычитаем в зависимости от оружия
ATR_STAMINA -= getRequiredStamina(ATR_DEXTERITY)*2;
};
};
}// если магия
else if(Npc_IsInFightMode(hero,FMODE_MAGIC))
{
// вычтем удвоенное количество уровня заклинания
ATR_STAMINA -= Npc_GetActiveSpellLevel(hero)*2;
};
//* DEBUG
printDbg("Стамина Лук " ,ATR_STAMINA);
// */
// Если выносливость упала НИЖЕ нуля то страдает зоровье
checkStamina();
//Проверим, не помер ли ГГ
checkDeath();
};
};
//Функции вызываемые каждую секунду
b_everySecond()
{
//...
// Подсчитать расход выносливости в бою
calcStaminaInFight();
//...
}
//=============================================================
// addSymbolsAtLeft()
//
// Позволяет получить строку заполненную count раз, переданным
// в параметре символом и оканчивающуюся переданной
// в параметре строкой.
// addSymbolsAtLeft("Endstring", "=",4) -> ====Endstring
// .
// string str - завершающая строка. Выводится всегда! "Endstring"
// string marker - заполняющий символ "="
// int count - сколько раз повторить маркер в строке "4"
//
//-------------------------------------------------------------
// Возвращает строку: ====Endstring
func string addSymbolsAtLeft(var string str, var string marker, var int count)
{
if(count <= 0) {return str;};
count-=1;
return ConcatStrings(marker,addSymbolsAtLeft(str, marker, count));
};
//=============================================================
// formatNuber()
//
// !!! Максимально обрабатываемое число 6 символов (999999)
// Достраивает число до нужного разряда добавлением символов слева
// 1 -> 001 или 1-> __1
//
// при привышении, число выводится как есть
//
// int number - Число само положительное
// int length - какой длинны должно получится итоговое число
// string marker - маркер добавляемы слева
// -------------------------------------------------------------------
// Возвращает строку: formatNuber(88, 4, _)->"__88"
//
func string formatNuber(var int number, var int length, var string marker)
{
// Если Лимит возможностей функции превышен > 6 символов
// число выводится строкой без модификации
if(number>=1000000){
return IntToString(number);
};
var int razr; // сколько
// опредедить из скольки разрядов состоит число
if(number < 10)
{
razr=1;
}
else if(number < 100)
{
razr=2;
}
else if(number < 1000)
{
razr=3;
}
else if(number < 10000)
{
razr=4;
}
else if(number < 100000)
{
razr=5;
}
else if(number < 1000000) //число из 6 символов
{
razr=6;
};
// Если число разрядов равно длинне получаемого числа то
if(razr == length){
return IntToString(number);
};
// Дополнить число слева маркером
return addSymbolsAtLeft(IntToString(number), marker, length-razr);
};
// ==========================================================
// printDbg()
//
// Функция циклического вывода дебаг информации на экран
// высотой 20 строк на 19 секунд каждая
// string meesage - Строка сообщения
// int value - значение
//
var int y_incr;
func void printDbg(var string meesage, var int value)
{
if(value<0){value=0;};
if(y_incr > 20){y_incr=0;};
PrintScreen(ConcatStrings(meesage,formatNuber(value,5," ")),10,10+y_incr*3,FONT_ScreenSmall,19);
y_incr+=1;
};
Я поставил на 1/10 секунды. Также в связке с триггером выстрел регистрируется при попадании стрелы в жертву - сбрасывается прицел, закликивание не прокатитТриггер планирую перенастроить на 300 милесекунд.
Хочется выдернуть меню из G3.
какой программой и из какого файла можно выдернуть?
..... написал(а):яж гуарыл, план Аллена Даллеса в действии...
Так у тебя стоит что-ли комьюнити патчь?Я искал, но так и не нашёл чем открывать .m01 и .mod файлы.
нашёл только для 1 и 2 частей.