Co zrobiłem źle? 5799 16

O temacie

Autor bobel

Zaczęty 10.12.2009 roku

Wyświetleń 5799

Odpowiedzi 16

bobel

bobel

Użytkownicy
posty17
  • Użytkownicy
func int CmpNpc(var c_npc p1,var c_npc p2)
{
var int old1;
var int old2;
var int result;
old1=p1.aivar[0];
old2=p2.aivar[0];
p1.aivar[0]=0;
p2.aivar[0]=1;
result=p1.aivar[0];
p1.aivar[0]=old1;p2.aivar[0]=old2;
return result;
};

func void weaponreaction(var c_npc Hero,var c_npc Self)
{
if(!Npc_IsInFightMode(hero,FMODE_MELEE))
{
return;
};
var c_item weapon;
var c_item eqweapon;
weapon=Npc_GetReadiedWeapon(hero);
eqweapon=Npc_GetEquippedMeleeWeapon(hero);
if(Hlp_IsItem(weapon,Kilof_runiczny)) //Kod broni
{
Wld_PlayEffect("SPELLFX_FIRESTORM",self,self,0,50,DAM_MAGIC,FALSE); // Efekt wywoływany przy uderzeniu na samym dole podam liste efektów
}
else if (Hlp_IsItem(eqweapon,Kilof_runiczny )) //Kod broni
{
Wld_SendTrigger("weaponreaction");
};
};

func void Sbd_is_damaged()
{
if (self==other&&hero==victim)
{
if(Npc_IsPlayer(victim)&&CmpNpc(self,other))
{
weaponreaction(self,hero);
};
};
};





Co jest źle w tym skrypcie? Licze na pomoc?
 

jendrzejs

jendrzejs

Użytkownicy
posty586
Propsy31
Profesjabrak
  • Użytkownicy
Podasz może błąd ? Bo nie mam za bardzo czasu aby sam sprawdzac...
 

bobel

bobel

Użytkownicy
posty17
  • Użytkownicy
A no racja, tak więc wchodzę do gry, wyciągam broń, bije i.... nic, nie było efektu. Co sie stało?
 


Zkirtaem

Zkirtaem

Moderator
Mięso
posty2171
Propsy1689
ProfesjaGracz
  • Moderator
  • Mięso
O ile pamiętam, tu było więcej plików, niż ten jeden cmpnpc, ale mogę się mylić. Spróbuj uderzyć w osoby o różnych "stanach skupienia" - w diego, który nie reaguje, w innych, mi się kiedyś popsuło i jak walnąłem kogoś "znienacka" - jak Diego - to efekcik działał.
 

bobel

bobel

Użytkownicy
posty17
  • Użytkownicy

bobel

Co zrobiłem źle?
#5 2009-12-10, 19:01(Ostatnia zmiana: 2009-12-10, 20:05)
Zabiłem trolla, diega, thorusa, kopaczy, strażników i cieni i.... nic ;]

Zrobiłem za to nowy skrypt, który jak sądze jest lepszy, ale jest błąd i nie wiem jak to zrobić?

Cytuj
func int CmpNpc(var c_npc p1,var c_npc p2)
{
var int old1;
var int old2;
var int result;
old1=p1.aivar[0];
old2=p2.aivar[0];
p1.aivar[0]=0;
p2.aivar[0]=1;
result=p1.aivar[0];
p1.aivar[0]=old1;
p2.aivar[0]=old2;
return result;
};

func void weaponreaction(var c_npc Hero,var c_npc Self)
{
if(!Npc_IsInFightMode(hero,FMODE_MELEE))
{
return;
};
var c_item weapon;
var c_item eqweapon;
weapon=Npc_GetReadiedWeapon(hero);
eqweapon=Npc_GetEquippedMeleeWeapon(hero);
if(Hlp_IsItem(weapon,Kilof_runiczny))
{
Wld_PlayEffect("SPELLFX_FIRESTORM",self,self,0,50,DAM_MAGIC,FALSE);
}
else if (Hlp_IsItem(eqweapon,Kilof_runiczny))
{
Wld_SendTrigger("weaponreaction");
};
};

func void Sbd_is_damaged()
{
if (self==other&&hero==victim)
{
if(Npc_IsPlayer(victim)&&CmpNpc(self,other))
{
weaponreaction(self,hero);
};
};

ZS_ReactToDamage      // <------- Tu jest błąd, co z tym zrobić?
B_CombatReacttodamage
B_MM_ReactToDamage
B_MM_ReactToCombatDamage
B_Orc_AssessDamage
func void B_Orc_AssessCombatDamage()
{
weaponreaction(other,self);
};
};
 

dr inż. Fenix

dr inż. Fenix

The Modders
Dekadent
posty262
Propsy131
  • The Modders
  • Dekadent
Za nim zaczniesz robić skrypty z magicznymi broniami, naucz się zależności pomiędzy poszczególnymi blokami kodu w gothicu. Inaczej nic nie zdziałasz.
Dopóki tego nie zrobisz nie zrozumiesz co robisz nie tak.
 
"Wolna wola jest iluzją!"

"Biorąc pod uwagę, że wszechświat jest układem zamkniętym, w którym wszystkie ruchy cząstek elementarnych, będących bodźcami organizmów żywych są determinowane ruchami Browna trwającymi od wielkiego wybuchu."

Jednak czy wszechświat to tylko cząstki elementarne?





"I am the blade of TheModders!"

bobel

bobel

Użytkownicy
posty17
  • Użytkownicy
Ale jak ja mam sie tego nauczyć?
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Zacznij od prostych rzeczy.

Poza tym nie odpowiedziałeś na pytanie:
Cytuj
A gdzie umieściłeś tą funkcję? Tzn przez jakie funkcje jest wywoływana?
Ja od siebie zapytam, jak się nazywa plik z tym skryptem?

bobel

bobel

Użytkownicy
posty17
  • Użytkownicy
Plik nazywa sie mieczruniczny.d a z tą funkcją to o co chodzi bo coś nie zrozumiałem.
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Co zrobiłem źle?
#10 2009-12-12, 15:49(Ostatnia zmiana: 2009-12-12, 15:51)
z tą funkcją to o co chodzi bo coś nie zrozumiałem.
No tak, mogłem się tego spodziewać. Niektórzy nieobeznani z programowaniem dość często myślą, że jak zrobisz jakąś funkcję i zapiszesz ją w pliku który jest parsowany to od razu gra sama się domyśli kiedy i jak ją wywołać. Otóż nie, samo napisanie funkcji powoduje że ona istnieje, jednak nie jest aktywowana. Aby tak się stało trzeba w jakiejś funkcji wywoływanej przez silnik dodać odwołanie do niej. W przypadku efektów wyzwalanych przy trafieniu trzeba zrobić to w funkcjach ZS_Reacttodamage, B_CombatReacttodamage, B_MM_ReactToDamage, B_MM_ReactToCombatDamage i B_Orc_AssessDamage.
Jeśli nie wiesz w jakich plikach i gdzie się znajdują, skorzystaj z dowolnego programu mogącego wyszukiwać ciągi tekstowe w plikach, np Total Commandera lub Gothic Sourcera.

bobel

bobel

Użytkownicy
posty17
  • Użytkownicy
Ale u mnie niema B_MM_ReactToDamage i  B_MM_ReactToCombatDamage
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Co zrobiłem źle?
#12 2009-12-13, 20:24(Ostatnia zmiana: 2009-12-13, 20:25)
Ale u mnie niema B_MM_ReactToDamage i  B_MM_ReactToCombatDamage
Są na 100% tylko niekoniecznie w osobnych plikach, tak jak pisałem musisz użyć programu wyszukującego fragmenty tekstu treści plików, a nie samych nazwach.

bobel

bobel

Użytkownicy
posty17
  • Użytkownicy
Ale jak znaleść to tym gothic sourcerem bo nie umiem
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Co zrobiłem źle?
#14 2009-12-13, 20:47(Ostatnia zmiana: 2009-12-13, 20:49)
Ale jak znaleść to tym gothic sourcerem bo nie umiem
Tworzysz nową solucję, jako źródło wybierasz plik gothic.src z folderu scripts/content, ignorujesz ewentualne błędy. Następnie używasz "find in files". Jednak z uwagi na możliwość wystąpienia licznych błędów związanych z działaniem tego programu radziłbym użyć total commandera bądź w ostateczności standardowej Windowsowej wyszukiwarki (może nie zadziałać).

bobel

bobel

Użytkownicy
posty17
  • Użytkownicy
Ale jak ja nawet znajde to to co mam z tym zrobić?
PS. Może wyślij mi gotowe skrypty miecza to ja zobacze jak to ma być.
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Co zrobiłem źle?
#16 2009-12-14, 20:39(Ostatnia zmiana: 2009-12-14, 21:10)
Po prostu w tych funkcjach, choćby na początku, zaraz za "{", masz dać "Sbd_is_damaged()", uruchomi to twoją funkcję. Jednak nie jestem pewien czy cały ten skrypt który pokazałeś jest prawidłowy, ja tylko opisuję sposób działania aktywatora. Nie mam akurat skryptów które mógłbym pokazać, masz tutoriale i to musi niestety wystarczyć.

Ogółem najważniejsze to zrozumieć że całe skrypty takiego miecza dzielą się na 3 najważniejsze części:
  • skrypt zwyczajnego miecza
  • odsyłacze do twojej funkcji zamieszczone w skryptach gry
  • funkcja sprawdzająca czy atakujący korzysta z tej właśnie broni i wywołująca w tym wypadku efekt specjalny, ewentualnie dodatkowo zapobiegająca błędom związanym z częstym "zacięciem się" efektu

Najlepiej sprawdzaj czy działa po kolei, do następnego kroku przejdź jeśli poprzedni prawidłowo zadziała w grze
[list=1]
  • zrób zwyczajny prosty miecz
  • stwórz prostą funkcję wyświetlającą na ekranie krótki tekst
  • w skryptach gry (ZS_Reacttodamage, B_CombatReacttodamage, B_MM_ReactToDamage, B_MM_ReactToCombatDamage i B_Orc_AssessDamage) umieść odwołania do niej. W efekcie jeśli ktokolwiek zaatakuje kogokolwiek jakąkolwiek bronią, powinien się na ekranie pokazywać tamten napis
  • do stworzonej przez siebie funkcji polecenie wyświetlania napisu i zastąp je warunkiem że instance broni atakującego musi być ten twój miecz.
  • zastąp wyświetlanie napisu efektem wizualnym (np. Wld_PlayEffect("SPELLFX_FIRESTORM",self,self,0,50,DAM_MAGIC,FALSE); )
  • dodaj funkcję i warunek zapobiegający "zacinaniu się" efektu (CmpNpc)

Jeśli nadal nie będziesz w stanie osiągnąć celu lub chociaż samemu znaleźć gdzie robisz błąd, sugeruję pójść za radą Fenixa i zająć się analizowaniem prostych skryptów. Jak na razie jakby próbujesz recytować z pamięci wiersz w języku którego w ogóle nie znasz. Poznaj chociaż składnię i podstawy funkcjonowania.


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry