Narzędzia, skrypty, problemy techniczne
#31
Dzięki, to jest trochę bardziej skomplikowane, to sobie później przejrzę.
Mam jeszcze jedno pytanko. Mam taką funkcję:

func void WERK_S1()
{
      Wld_PlayEffect("Spellfx_Armyofdarkness",  hero, hero, 1, 50, DAM_FIRE, FALSE );
};

i chciałbym, żeby to zadawało obrażenia bohaterowi. Efekt się odpala, ale żadnych obrażeń bohater nie dostaje. Co tu jest źle?
Odpowiedz
#32
Добавь
func void WERK_S1()
{
Wld_PlayEffect("Spellfx_Armyofdarkness", hero, hero, 1, 50, DAM_FIRE, FALSE );
//damage
hero.attribute[ATR_HITPOINTS] = hero.attribute[ATR_HITPOINTS] - 50;
};
Odpowiedz
#33
Działa  :) 

Tyle, że to odejmuje bohaterowi punkty życia, zawsze tyle samo, a da się zrobić żeby zamiast tego zabierania hp było uderzenie np od ognia za 50 punktów, tak jak chciałem to wcześniej wpisać, czy tylko Spacerem?
Odpowiedz
#34
С использованием Ikarus+Lego
Или делать урон зону в Spacer

var C_NPC global_fired_npc_self;
func void FireDamage()
{
global_fired_npc_self.attribute[ATR_HITPOINTS] = global_fired_npc_self.attribute[ATR_HITPOINTS] - 50;
if((global_fired_npc_self.aivar[AIV_VictoryXPGiven] == FALSE) && (global_fired_npc_self.attribute[ATR_HITPOINTS] <= 0))
{
B_GivePlayerXP(global_fired_npc_self.level * XP_PER_VICTORY);
global_fired_npc_self.aivar[AIV_VictoryXPGiven] = TRUE;
if (FF_Active(FireDamage))
{
FF_Remove(FireDamage);
};
};
};

func void WERK_S1()
{
Wld_PlayEffect("VOB_BURN",slf,slf,0,0,0,FALSE);
if(!FF_Active(FireDamage))
{
global_fired_npc_self = Hlp_GetNpc(slf);
FF_ApplyOnceExt(FireDamage, 1000, 3);
};
};
Odpowiedz
#35
To już chyba za trudne dla mnie. Wrócę do tej "mikstury modlitwy" na razie i to będę przeglądał. Dzięki  OK

Znalazłem taką stronkę z dźwiękami z Gothica, może komuś się przyda.

https://soundofgothic.pl/

(20.02.2020, 09:02:05)Erwin napisał(a): Co do tych skrzyń i pułapek w nich zawartych, to ja widzę to tak:
1.      Skrzynia w domu z pełzaczami.
Przywracam usunięte drzwi. Gracz znajduje tam skrzynię, która już się pojawiła. Gdy ją otwiera, drzwi się zatrzaskują i insertuje się jakiś potworek lub potworki ( w tej chwili ciężko mi to zbalansować ). Najlepiej jakaś nowa odmiana, z tych dodanych lub z WoG’a. Po zabiciu potworka, drzwi się otwierają lub po podniesieniu z niego jakiegoś itemu np. serca. Pułapka działa tylko jednorazowo. Nie wiem tylko, czy da się skryptowo tak zrobić, że po zabiciu konkretnego stwora, czy podniesienia odpowiedniego itemu, da się ustawić otwarcie drzwi.

N1kX, wiesz może, czy jest jakaś funkcja do skryptu, żeby po śmierci określonego potwora, otworzyła się brama?
N1kX, вы не знаете, есть ли функция для сценария, чтобы после смерти определенного монстра ворота открылись?
Odpowiedz
#36
Разместить в мире циклический триггер, который будет вызывать функцию, в которой будет проверятся смерть нужного НПС
Как только НПС будет мертв, послать сигнал Wld_SendTrigger нужному объекту.
Не знаю, есть ли подобный урон на польском. У нас есть.
https://worldofplayers.ru/threads/31401/#post-438902
Odpowiedz
#37
A mógłbyś mi podać jakąś funkcję do sprawdzenia śmierci tego NPC, bo ja nie znam się za bardzo na skryptach?  :)
Odpowiedz
#38
Ну в циклическую функцию можно вот что добавить

func void B_CYCLE_FUNCTION()
{
if(hero.attribute[ATR_HITPOINTS_MAX] == 0) //Проверка, загружен ли ГГ в мир игры. Если игра еще не загрузила ГГ в игру, значение максимальной жизни ГГ будет равно 0 и вызов триггера будет происходить до выполнения своих нужных функций. Это проверка необходима, т.к. если ГГ еще не загружен в игру и функция начнет полную отработку, возможен вылет из игры.
{
Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера c именем CYCLE_TRIGGER для зацикливания всей функции.
return; //Выход из функции.
};

//Если ГГ уже загружен в игру, дальше идет полная отработка цикла, куда можно вставлять множество своих нужных функций...
//для примера проверим смерть волка
var C_NPC npc;
npc = Hlp_GetNpc(PEPES_YWolf1);
//если наш волк мертв
if(Npc_IsDead(npc))
{
//запускаем подъем ворот
Wld_SendTrigger("LEBEDKA");
};
Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера c именем CYCLE_TRIGGER для зацикливания всей функции.
};

Но я бы посоветовал сделать по-другому (не доверяю я функции Npc_IsDead)
В zs_dead.d добавить проверку
//если убитый монстр равен нашему монстру
if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(WolfMIS))
{
//он убит
K_WolfKilled= TRUE;
};


func void B_CYCLE_FUNCTION()
{
if(hero.attribute[ATR_HITPOINTS_MAX] == 0) //Проверка, загружен ли ГГ в мир игры. Если игра еще не загрузила ГГ в игру, значение максимальной жизни ГГ будет равно 0 и вызов триггера будет происходить до выполнения своих нужных функций. Это проверка необходима, т.к. если ГГ еще не загружен в игру и функция начнет полную отработку, возможен вылет из игры.
{
Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера c именем CYCLE_TRIGGER для зацикливания всей функции.
return; //Выход из функции.
};

//Если ГГ уже загружен в игру, дальше идет полная отработка цикла, куда можно вставлять множество своих нужных функций...
//для примера проверим смерть волка
//если наш НПС мертв
if(K_WolfKilled == TRUE)
{
//запускаем подъем ворот
Wld_SendTrigger("LEBEDKA");
};
Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера c именем CYCLE_TRIGGER для зацикливания всей функции.
};
Odpowiedz
#39
O właśnie  OK Dzięki. Akurat coś tam próbowałem z tą funkcją Npc_IsDead robić i nie bardzo to wychodziło. Jak napiszę sobie potrzebny skrypt, to jeszcze tu wrzucę do sprawdzenia   :)

Do pliku ZS_Dead w folderze: \_Work\data\Scripts\Content\AI\Human\ZS_Human dodałem:

if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(ORC_8537_SHAMAN))
{
K_ShamanKilled= TRUE;
};

a to dodałem do startup

func void B_CYCLE_FUNCTION()
{
if(hero.attribute[ATR_HITPOINTS_MAX] == 0) 
{
Wld_SendTrigger("CYCLE_TRIGGER");
return; 
};
if(K_ShamanKilled == TRUE)
{
Wld_SendTrigger("TEST1");
};
Wld_SendTrigger("CYCLE_TRIGGER"); 
};

i przy odpalaniu pokazuje mi błąd:

U: PAR:Syntax error: IF ( line 102 ) - linia 102, to ta na czerwono.

Mógłbyś N1kX spojrzeć?

A i dodałem do func void INIT_STRAND () w startup B_CYCLE_FUNCTION();  
i tą funkcję przeniosłem ze startup, bo w poradniku pisało żeby tak nie robić,
ale dalej mam ten błąd.

Masakra, jak człowiek nie zna teorii i podstaw skryptów do Gothica  Smutny
Ten błąd 102 to jednak był tu:
f(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(ORC_8537_SHAMAN))
w tej linijce, bo jak przeniosłem funkcję ze startup, to tam nawet takiej linijki 102 nie było.

Zrobiłem to jeszcze raz wg pierwszej wersji i napisałem taki skrypt:

func void B_CYCLE_FUNCTION()

{
if(hero.attribute[ATR_HITPOINTS_MAX] == 0) 
{
Wld_SendTrigger("CYCLE_TRIGGER");
return; 
};
var C_NPC npc;
npc = Hlp_GetNpc(ORC_8537_SHAMAN);

if(Npc_IsDead(npc))
{
Wld_SendTrigger("TEST1");
Wld_SendTrigger("CYCLE_TRIGGER");
};
};

no i jest prawie dobrze, prawie, bo po śmierci orka-szamana brama się w kółko otwiera i zamyka. Pewnie dlatego, że dany NPC jest martwy uruchamia się brama i od nowa ten zapętlony trigger, a że NPC jest dalej martwy, to cała akcja się powtarza.
Odpowiedz
#40
func void B_CYCLE_FUNCTION()
{
if(hero.attribute[ATR_HITPOINTS_MAX] == 0)
{
Wld_SendTrigger("CYCLE_TRIGGER");
return;
};

var C_NPC npc;
npc = Hlp_GetNpc(ORC_8537_SHAMAN);
var int Test1;

if(Npc_IsDead(npc) && (Test1 == FALSE))
{
Wld_SendTrigger("TEST1");
Test1 = true;
};

Wld_SendTrigger("CYCLE_TRIGGER");
};
Odpowiedz
#41
Działa znakomicie  OK  Dzięki za cierpliwość  OK
Odpowiedz
#42
Кстати я обнаружил совсем нелепую ошибку, это в заметку
Посмотрим триггер смены локации в Хоиринсе в Долину Предков, у него есть ошибка
[% oCTriggerChangeLevel:zCTrigger:zCVob 24577 247]
pack=int:0
presetName=string:
bbox3DWS=rawFloat:6335.02734 326.856812 -24783.8125 6733.29932 718.856812 -24312.6328
trafoOSToWSRot=raw:0000803f0000008000000000000000000000803f0000000000000080000000800000803f
trafoOSToWSPos=vec3:6728.29932 557.856812 -24317.6328
vobName=string:GONEWLOCATION
visual=string:
showVisual=bool:1
visualCamAlign=enum:0
visualAniMode=enum:0
visualAniModeStrength=float:0
vobFarClipZScale=float:1
cdStatic=bool:0
cdDyn=bool:1
staticVob=bool:1
dynShadow=enum:0
zbias=int:0
isAmbient=bool:0
[visual % 0 0]
[]
[ai % 0 0]
[]
triggerTarget=string:
flags=raw:07
filterFlags=raw:12
respondToVobName=string:
numCanBeActivated=int:-1
retriggerWaitSec=float:0
damageThreshold=float:0
fireDelaySec=float:0
levelName=string:TOWERWORLD/TOWERWORLD.ZEN
startVobName=string:START_TOWERWORLD
[]
В Windows путь указывается через другой знак слеша \, а не через /
Правильнее будет
levelName=string:TOWERWORLD\TOWERWORLD.ZEN
Такая же нелепая ошибка есть в 3 картах долины предков + насчитал 5 триггеров.
Пример карты
Ошибка, которая может быть в игре будет следующей:
Например пропадает указатель положения ГГ на карте, или мир может быть неправильно инициализирован и т.п.
Подозреваю, что все эти недочеты допустили авторы Глобал мода.
/ используется только в браузере и в среде Интернет или сетевые протоколы
\ используется в ОС, в программах
Odpowiedz
#43
No ciekawe. Zauważyłem, że u siebie też mam ten błąd.
Mój roboczy plik startowy do świata:

[INFO]

Title=Gothic II: Night of the Raven
Version=2.6
Authors=Piranha Bytes
Webpage=http://www.piranha-bytes.com
Description=!<symlink>GothicGame.rtf
Icon=GothicStarter.exe

[FILES]
VDF=GothicGame.mod
Game=Content\Gothic
FightAI=Content\Fight
Menu=System\Menu
Camera=System\Camera
Music=System\Music
SoundEffects=System\SFX
ParticleEffects=System\ParticleFX
VisualEffects=System\VisualFX
OutputUnits=OU

[SETTINGS]
Player=PC_HERO
World=addon/ADDONWORLD.zen

[OPTIONS]
show_Info=0
show_InfoX=800
show_InfoY=7200
show_Version=1
show_VersionX=6500
show_VersionY=7200
show_Focus=1
show_FocusItm=1
show_FocusMob=1
show_FocusNpc=1
show_FocusBar=1
force_Subtitles=0
force_Parameters=

[OVERRIDES]
INTERNAL.extendedMenu=1

Jakimś cudem mi to działało.
Odpowiedz
#44
Нашел интересную программу. Она умеет показывать в папке файлы с их кодировку. Теперь будет удобнее искать неправильные файлы.

Криво работает только...
Odpowiedz
#45
N1kX, a da się Vobbildera otworzyć Yandex'em? Obecnie muszę tego typu katalogi otwierać Internet Explorer, bo tam mogę włączyć ActiveX. Ewentualnie Chrome, bo tam jest jakaś nakładka, ale jest to niewygodne.
Odpowiedz


Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości