Dołączył: 24.03.2018
Liczba postów:1.389
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?
Dołączył: 08.07.2018
Liczba postów:799
Добавь
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;
};
Dołączył: 24.03.2018
Liczba postów:1.389
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?
Dołączył: 08.07.2018
Liczba postów:799
С использованием 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);
};
};
Dołączył: 24.03.2018
Liczba postów:1.389
To już chyba za trudne dla mnie. Wrócę do tej "mikstury modlitwy" na razie i to będę przeglądał. Dzięki
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, вы не знаете, есть ли функция для сценария, чтобы после смерти определенного монстра ворота открылись?
Dołączył: 08.07.2018
Liczba postów:799
Разместить в мире циклический триггер, который будет вызывать функцию, в которой будет проверятся смерть нужного НПС
Как только НПС будет мертв, послать сигнал Wld_SendTrigger нужному объекту.
Не знаю, есть ли подобный урон на польском. У нас есть.
https://worldofplayers.ru/threads/31401/#post-438902
Dołączył: 24.03.2018
Liczba postów:1.389
A mógłbyś mi podać jakąś funkcję do sprawdzenia śmierci tego NPC, bo ja nie znam się za bardzo na skryptach?
Dołączył: 08.07.2018
Liczba postów:799
Ну в циклическую функцию можно вот что добавить
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 для зацикливания всей функции.
};
Dołączył: 24.03.2018
Liczba postów:1.389
24.02.2020, 19:41:04
(Ten post był ostatnio modyfikowany: 24.02.2020, 19:41:39 przez Erwin.)
O właśnie 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
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.
Dołączył: 08.07.2018
Liczba postów:799
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");
};
Dołączył: 24.03.2018
Liczba postów:1.389
Działa znakomicie Dzięki za cierpliwość
Dołączył: 08.07.2018
Liczba postów:799
Кстати я обнаружил совсем нелепую ошибку, это в заметку
Посмотрим триггер смены локации в Хоиринсе в Долину Предков, у него есть ошибка
[% 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 триггеров.
Пример карты
instance ITWR_MAP_VALLEYANCESTORPOGOSTS(C_Item)
{
name = "Карта кладбищ в Долине Предков";
mainflag = ITEM_KAT_DOCS;
flags = ITEM_MISSION | ITEM_MULTI;
value = 450;
visual = "ItWr_Map_01.3DS";
material = MAT_LEATHER;
scemeName = "MAP";
on_state[0] = use_map_valleyancestorpogosts;
description = name;
//text[0] = "";
//text[1] = "";
text[5] = NAME_Value;
count[5] = value;
};
func void use_map_valleyancestorpogosts()
{
var int Document;
if(Npc_IsPlayer(self))
{
B_SetPlayerMap(itwr_map_valleyancestorpogosts);
};
Document = Doc_CreateMap();
Doc_SetPages(Document,1);
Doc_SetPage(Document,0,"MAP_VALLEYANCESTORS_STRAZH.tga",TRUE);
Doc_SetLevel(Document,"TOWERWORLD/TOWERWORLD.ZEN");
Doc_SetLevelCoords(Document,93500,55000,223600,-35800);
Doc_Show(Document);
};
Должно быть
Doc_SetLevel(Document,"TOWERWORLD[b]\TOWERWORLD.ZEN");[/b] Ошибка, которая может быть в игре будет следующей:
Например пропадает указатель положения ГГ на карте, или мир может быть неправильно инициализирован и т.п.
Подозреваю, что все эти недочеты допустили авторы Глобал мода.
/ используется только в браузере и в среде Интернет или сетевые протоколы
\ используется в ОС, в программах
Dołączył: 24.03.2018
Liczba postów:1.389
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.
Dołączył: 08.07.2018
Liczba postów:799
Нашел интересную программу. Она умеет показывать в папке файлы с их кодировку. Теперь будет удобнее искать неправильные файлы.
Криво работает только...
Dołączył: 24.03.2018
Liczba postów:1.389
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.
|