Npc_HasItems nie działa 2356 9

O temacie

Autor outlander

Zaczęty 11.07.2019 roku

Wyświetleń 2356

Odpowiedzi 9

outlander

outlander

Użytkownicy
posty452
Propsy224
ProfesjaReżyser
  • Użytkownicy
instance DIA_GILBERT_GIVEDIARY(C_Info)
{
npc = hun_2018_gilbert;
nr = 2;
condition = dia_gilbert_givediary_condition;
information = dia_gilbert_givediary_info;
permanent = FALSE;
important = FALSE;
description = "Czy o to chodzi?";
};


func int dia_gilbert_givediary_condition()
{
if Npc_HasItems(hero,ts_gilbertstories == 1) && (DZIENNIKGILBERTA == LOG_RUNNING)
{
return TRUE;
};
};

func void dia_gilbert_givediary_info()
{
AI_Output(other,self,"DIA_Gilbert_GiveDiary_1_01"); //Czy o to chodzi? 
AI_Output(self,other,"DIA_Gilbert_GiveDiary_1_02"); //Tak! Niestety nie mam nic, co mogłoby przydać się tobie, wojownikowi...
AI_Output(other,self,"DIA_Gilbert_GiveDiary_1_03"); //Nic nie szkodzi.
B_GiveInvItems(other,self,ts_gilbertstories,1);
finishquest_gilbertsdiary();
};
Czy spotkał się ktoś z was kiedyś z czymś takim, że ten warunek nie działa mimo iż mamy item? Nie w każdym dialogu, tylko w tym. To jakaś blokada przed dodawaniem zbyt dużej ilości gównoquestów czy ja coś źle zrobiłem i nie widzę? Mam wrażenie, że w ER też nie zawsze działało tyle, że z rudą. Ale tutaj wyrzucenie i podniesienie przedmiotu ponownie nie pomaga.
 

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
Tu jest źle:
ts_gilbertstories == 1
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

outlander

outlander

Użytkownicy
posty452
Propsy224
ProfesjaReżyser
  • Użytkownicy
było >= i też nie działa
Czemu to miałoby być źle?
 

Fabio

Fabio

The Modders
posty3466
Propsy2150
ProfesjaSkrypter
  • The Modders
func int dia_gilbert_givediary_condition()
{
if Npc_HasItems(hero,ts_gilbertstories == 1) && (DZIENNIKGILBERTA == LOG_RUNNING)
{
return TRUE;
};
};

na:
func int dia_gilbert_givediary_condition()
{
if  (Npc_HasItems (other ,ts_gilbertstories) == 1) && (MIS_DZIENNIKGILBERTA == LOG_RUNNING)
{
return TRUE;
};
};

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
Otóż to.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

bogu9821

bogu9821

Użytkownicy
posty404
Propsy185
ProfesjaProgramista
  • Użytkownicy

bogu9821

Npc_HasItems nie działa
#5 2019-07-11, 22:58(Ostatnia zmiana: 2019-07-11, 23:03)
Jednakże nawiasu przed if'em nie trzeba. Może być tak, jak pokazał Fabio, ale obie formy są poprawne. :>

W sensie, że może być też tak:func int dia_gilbert_givediary_condition()
{
if Npc_HasItems(hero,ts_gilbertstories ) == 1) && (DZIENNIKGILBERTA == LOG_RUNNING)
{
return TRUE;
};
};

Problem u ciebie było, iż sprawdzałeś, czy instancja == 1, a nie czy wynik zwracany to 1.
 
while(false) Do();

outlander

outlander

Użytkownicy
posty452
Propsy224
ProfesjaReżyser
  • Użytkownicy
Działa. Nie wiedziałem, że nawiasy mają tutaj aż takie znaczenie. Dzięki!
 

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
Mają, mają. Już wyjaśniam jak to działa. ts_gilbertstories to indeks z tablicy symboli parsera. Załóżmy, że jego indeks wynosi 15000. Więc w tym przypadku
ts_gilbertstories == 1
to tak naprawdę: 15000 jest równe 1. Ale nie jest, więc ts_gilbertstories == 1 to w rzeczywistości 0. Więc funkcja Npc_HasItems przeszukuje ekwipunek by znaleźć przedmiot, którego indeks wynosi 0. A jako iż taki przedmiot nie istnieje w ogóle, to tym bardziej postać go nie ma.

Btw. programiści Piranha Bytes zajmujący się skryptami mieli dziwny styl ich pisania, który modderzy niepotrzebnie naśladują. W przypadku dialogów, które nie miały żadnych wymogów, niepotrzebnie robili dla nich funkcje, które zawsze zwracały true, czyli 1. To tylko niepotrzebnie robi syf w tablicy symboli parsera. Tak, w takich przypadkach można po prostu zrobić to w ten sposób:
condition = true;zamiast tworzyć niepotrzebną funkcję zwracającą inta.

Natomiast w przypadku kilku warunków można zrobić na przykład tak:
return Npc_HasItems(hero,ts_gilbertstories ) == 1 && DZIENNIKGILBERTA == LOG_RUNNING;
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

outlander

outlander

Użytkownicy
posty452
Propsy224
ProfesjaReżyser
  • Użytkownicy

outlander

Npc_HasItems nie działa
#8 2019-07-12, 08:19(Ostatnia zmiana: 2019-07-12, 08:32)
Dzięki! Też kiedyś wpadłem na to z condition, ale zawsze myślałem, że tak ma być, bo parser będzie oczekiwał odwołania do funkcji a nie do jej, że to tak nazwę, "bezpośredniego efektu".

Aż się pokusiłem o test.
 

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
Nie przetestowałem tego w praktyce. Niestety zmienna condition w klasie C_Info nie jest zmienną liczbową, tylko zmienną func. Po co sobie tak utrudnili? xD
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie


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