Thread Rating:
  • 1 Vote(s) - 5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
callClientFunction zwraca wartość null
#1
Witam, to znowu ja. Prawdopodobnie często będę się zwracał do Was o pomoc, jak sam niczego nie wymyślę. Wracając do problemu, próbuję przekazać wartość pobraną od klienta za pomocą funkcji getExp() do serwera, używając callClientFunction. Próbowałem też używać pakietów, niestety wynik jest ten sam. Gdy wyświetlam to po stronie klienta, wszystko śmiga, ale po przekazaniu tej wartości na stronę serwera, wyświetla mi "(null : 0x00000000). Chwytałem się wszystkiego, ale nie potrafię wymyśleć co robię źle Smile
Reply
#2
jeżeli np. chcesz zapisać gdzieś tą wartość to używasz w kliencie :

callServerFunc("Zapis", heroId, getExp());

Serwer :

function Zapis(pid, exp)
{
print(exp);
}

Prawdopodobnie zwróci ci exp Smile.
Najprościej jednak mieć gdzieś zapisane na serwerze te funkcje.
Powiedzmy na szybko wklepane :
Players <- [];

for (local i = 0; i < getMaxSlots(); ++i)
{
Players[i] <- {};
Players[i].exp <- 0;
}


function setPlayerExp(pid, val)
{
Players[pid].exp = val;
callClientFunc(pid, "setExp", val);
}

function getPlayerExp(pid)
{
return Players[pid].exp;
}

Jak chcesz zrozumiec jak działa wysyłanie pakietu itd. Popróbuj bez callClientFunc,callServerFunc tylko na sendPacket
[Image: Quarchodr_sheqnnr.png]
Reply
#3
Nie do końca o to mi chodzi. Chciałbym pobrać ilość doświadczenia od gracza i zapisać ją w zmiennej po stronie serwera. Mniej-więcej orientuje się jak działają pakiety i używam ich do ustawienia poziomu czy punktów nauki wcześniej zapisanych w bazie danych:
function setLvl(pid, lvl)
{
local packet = Packet();
packet.writeUInt8(packetID.Lvl);
packet.writeUInt8(lvl);
packet.send(pid, RELIABLE_ORDERED);
}
Jednakże, w drugą stronę już nie jest tak dobrze, więc dla ułatwienia używam callClientFunc. W tej chwili mój kod wygląda tak:

Klient:

function test()
{
return getExp();
}

Serwer:

function onPlayerDisconnect(pid, reason)
{
local value = callClientFun(pid, "test");
print(value);
}

No i na końcu handler onPlayerDisconnect. Wszystko działa, aż do momentu kiedy wyjdę, a w konsoli zamiast posiadanego doświadczenia, pojawia się wyżej juz wymieniona wartość :/
Reply
#4
local value = callClientFun(pid, "test");
print(value);
Prześledź jak działa Funkcja callClientFunc i czy coś wogóle ma prawo cos zwracać.
[Image: Quarchodr_sheqnnr.png]
Reply
#5
Squirrel Script
  1. function onPlayerDisconnect(pid, reason)
  2. {
  3. local value = callClientFun(pid, "test");
  4. print(value);
  5. }


Pakiet nie dotrze, bo gracza już nie ma. Zapisuj sobie doświadczenie po stronie serwera tak jak w przykładzie od Quarhodrona, pobieranie od strony klienta jest trochę głupie, gdyż wystarczy głupi Cheat Engine żeby go zwiększyć.
Reply
#6
Problem rozwiązany, rzeczywiście callClientFunc nie zwraca żadnej wartości. Musiałem się wcześniej pomylić przy użyciu pakietów, bo teraz śmiga.
Jednak teraz Tommy mi uświadomił, że przechowywanie jakiejkolwiek statystyki po stronie klienta nie jest dobrym rozwiązaniem. Dzięki za pomoc!
Reply
#7
Nie ma sprawy. dobrze,żę sie uczysz a nie powielasz głupie rozwiązania.
[Image: Quarchodr_sheqnnr.png]
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)