Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Blokowanie wykonania forwardu


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
1 odpowiedź w tym temacie

#1 Sniper Elite

    Master

  • Power User

Reputacja: 176
Profesjonalista

  • Postów:981
  • GG:
  • Imię:Konrad
  • Lokalizacja:Skryptolandia
Offline

Napisano 31.10.2014 10:08

Witam. Mam problem z zablokowaniem wykonania forwardu w sklepie biohazardu.

Chodzi o to, że np. kupując działko zabiera pieniądze nawet wtedy gdy stawiamy działko w miejscu gdzie nie da się go postawić. Kasy nie powinno zabierać, a zabiera niestety. Moje zasadnicze pytanie brzmi jak zatrzymać forward w konkretnym miejscu np. za pomocą return PLUGIN_HANDLED?

 

Próbowałem to zrobić tak:

 

g_selected_forward = CreateMultiForward("bio_item_selected", ET_STOP, FP_CELL, FP_CELL)

 

Zmieniłem tylko ET_IGRONE na ET_STOP licząc że forward się zatrzyma przy return PLUGIN_HANDLED. Funkcja wygląda tak:

public bio_item_selected(id, item)
{
if(item != g_sentry)
return PLUGIN_HANDLED

if(sentry_build(id)) //zwraca false w przypadku nieudanej proby postawienia
return PLUGIN_CONTINUE
else return PLUGIN_HANDLED;


return PLUGIN_CONTINUE
}

Ale po takiej akcji forward nie wykonuje się wcale.

 

Mam jeszcze pytanie jak przy nieudanej próbie wywołania forwardu zatrzymać plugin w miejscu jego wywołania?

public menu1_handle_human(id, menu, item)
{
if(item == MENU_EXIT || is_user_zombie(id))
{
menu_destroy(menu)
return PLUGIN_HANDLED
}


static data[6], szName[64], access, callback
static temp_integer1
menu_item_getinfo(menu, item, access, data, charsmax(data), szName, charsmax(szName), callback)


temp_integer1 = str_to_num(data)


static cost, wp_name[64], wp_desc[64]
cost = ArrayGetCell(Item_Cost, temp_integer1)
ArrayGetString(Item_Name, temp_integer1, wp_name, sizeof(wp_name))
ArrayGetString(Item_Desc, temp_integer1, wp_desc, sizeof(wp_desc))

static g_dummy
ExecuteForward(g_selected_forward, g_dummy, id, temp_integer1)
//Jezeli forward sie nie wykonal to jak zatrzymac te funkcje (sama sie zatrzymuje?)

if(cs_get_user_money(id) >= cost)
{
client_printc(id, "!g[Bio Shop]!n Kupiles !t%s!n za !t%i$!n !!!", wp_name, cost)
client_printc(id, "!g[Bio Shop]!n !t%s!n !!!", wp_desc)


cs_set_user_money(id, cs_get_user_money(id) - cost)


} else {
client_printc(id, "!g[Bio Shop]!n Nie masz wystarczajacej ilosci kasy aby kupic : !t%s!n. Koszt:!t%i$!n !!!", wp_name, cost)
}


return PLUGIN_CONTINUE
}

 

Gdyby komuś było potrzebne wysyłam obydwa pluginy w załącznikach.

 

Załączone pliki


  • +
  • -
  • 0

Kontakt:

Steam: CSnajper

GG: 4394855

 

Na steam i GG pomagam wyłącznie odpłatnie.


#2 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 04.11.2014 09:55

Aby dobrze zrozumieć o co chodzi i jak to zrobić, musisz zrozumieć czym jest return.

Otóż return powoduje zatrzymanie wywoływania bieżącej funkcji i zwraca jej rezultat. Ale dotyczy to WYŁĄCZNIE bieżącej funkcji, czyli w Twoim przypadku funkcji bio_item_selected. Return również zwraca w miejscu wywołania funkcji wartość, czyli:
funkcja1() {
    return 2
}
funkcja2() {
    new a = funkcja1();
}
w tym przykładzie zmienna a otrzyma wartość 2, bo taką wartość zwróciła funkcja1.

No dobrze, ale czym jest magiczne PLUGIN_HANDLED i PLUGIN_CONTINUE? Jest to ni mniej, ni więcej, jak wartości 0 i 1 (PLUGIN_HANDLED_MAIN jest równe 2), jednak jeśli zwrócimy taką liczbę do funkcji wywoływanej przez silnik AMXX podczepionej do jakiegoś eventu, spowoduje to jakieś działanie na tym evencie. PLUGIN_CONTINUE nic nie zrobi, PLUGIN_HANDLED zatrzyma event.

Forwardy RÓWNIEŻ mogą reagować na PLUGIN_HANDLED i PLUGIN_CONTINUE, jednak takie działanie musisz sam ustalić.

CreateMultiForward posiada parametr stop_type. Ustala on co się ma stać, gdy któraś z podczepionych do forwardu funkcji zwróci PLUGIN_HANDLED. Jednak ma to wpływ prawie wyłącznie na wykonywanie się innych funkcji podłączonych pod ten sam forward.

CreateOneForward ZAWSZE powoduje zwracanie wartości do ExecuteForward, ściślej do 2 parametru (w twoim przypadku g_dummy). Na podstawie tego parametru możesz złapać, czy forward wykonał się w 100% i zdecydować, czy chcesz zabrać graczowi kasę, czy nie.
  • +
  • -
  • 1

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark





Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych