←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Optymalny sposób - menu sklepu

Zablokowany

  • +
  • -
Krytykiewicz - zdjęcie Krytykiewicz 15.12.2012

Witam,

Posiadam menu do modu, mianowicie sklep. Jest on niestety napisany w 1 pluginie + kilka pluginów osobno, przez co do menu muszę wpisywać coś takiego: client_cmd(id, "komenda"); komenda = jakiś tam item, który jest w osobnym pluginie. Jak uważacie. Czy rozkład tego, aby menu sklepu było tak, iż każdy item będzie jako osobny plugin za pomocą forwardów i natyw będzie optymalny? Coś takiego jak cod mod lub diablo mod core by darkgl, gdzie itemy lub klasy tworzymy za pomocą nowego pluginu. Można podać przykład jak zrobić, aby dodać pewien item i pojawił się on w menu? Z resztą sobie poradzę sam. Czyli reasumując, główny plugin sklepu z forwardami i natywami, a itemy do tego jako osobny plugin. Nie chcę też, aby wszystko za mnie zostało napisane. Chodzi mi o podanie przykładu jak dodać item do menu pod komendą, np. /itemy.

Pozdrawiam
Odpowiedz

Gość_21977_* 16.12.2012

Zdecydowanie lepiej jest używać forwardów / natywów, niż wysyłania komend do gracza, wymaga to bowiem komunikacji z silnikiem gry poprzez Metamoda:P i to kilkukrotnie, co nie jest zbyt dobrym rozwiązaniem.

W pluginie sklepu, natyw register_przedmiot(opis, cena) będzie rejestrował nowy przedmiot w sklepie
register_native("register_przedmiot", "register_przedmiot");

public register_przedmiot(id, args){
new opis[200], koszt=get_param(2);
get_string(1, opis, 199);

// rejestrujesz nowy forward i zapisujesz sobie jego numer identyfikacyjny
// w momencie chęci wywołania forwardu z wybraniem tego przedmiotu,
// posłużysz się tym numerem identyfikacyjnym zwracanym przez funkcję CreateOneForward
CreateOneForward(id, "execute_przedmiot", FP_CELL);
}


W momencie zakupienia danego przedmiotu, wywolamy
ExecuteForward(ID_FORWARDU, id_kupujacego);

Gdzie ID_FORWARDU to wlasnie numer identyfikacyjny zwracany przez CreateOneForward z register_przedmiot

INC, dołączany do przedmiotów sklepu
native register_przedmiot(opis[200], cena);
/*
Rejestruje nowy przedmiot, natyw nalezy umiescic w funkcji plugin_init
opis - krótki opis przedmiotu do menu zakupow, limit 200 znaków
cena - cena przedmiotu w sklepie
*/

forward execute_przedmiot(id);
/*
Informuje o zakupie przedmiotu przez okreslonego gracza
id - numer identyfikacyjne gracza, ktory zakupil przedmiot
*/


I w SMA przedmiotow, dodamy do plugin_init
register_przedmiot("Opis przedmiotu", cena);

Oraz dodamy funkcję publiczną
public execute_przedmiot(id)
Która będzie wywoływana w momencie zakupu przedmiotu przez danego gracza.

Nie chcę też, aby wszystko za mnie zostało napisane. Chodzi mi o podanie przykładu jak dodać item do menu pod komendą, np. /itemy.

Mam nadzieję, że mi się udało. Podoba mi się ta postawa :)
Użytkownik benio101 edytował ten post 16.12.2012 09:15
-dbl.
Odpowiedz

  • +
  • -
Krytykiewicz - zdjęcie Krytykiewicz 16.12.2012

Dzięki wielkie serdeczne. To jest bardzo duża pomoc, bo generalnie miałem już plan jak mniej-więcej zrobić coś takiego tylko szczerze powiedziawszy kompletnie nie wiedziałem jak zrobić, aby w menu wyświetlił się item. Jeśli będę potrzebował jeszcze pomocy, ponieważ szczerze mówiąc pierwszy raz zacznę robić sklep takim rozwiązaniem to proszę nie zamykać tematu, napiszę tutaj. To jest nauka, dążę do celu i mam nadzieję, że mi się to uda.

Pozdrawiam.
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 16.12.2012

Przy CreateOneForward jest pewne ograniczenie... musisz w pluginie menu zapisywać ID forwardu dla każdego z itemów, przez co masz ograniczoną ilość tych itemów, albo przymus użycia dynamicznych tablic. Poza tym zrobienie wielu wpisów w menu dla jednego pluginu byłoby mocno problematyczne.

Jest rozwiązanie prostsze, zrobić MultiForward, a w natywie ustawić, aby zwracał id z menu (menu tworzyć można raz, statycznie przecież). Do forwardu przekazywać parametr z id aktualnie wybranego przedmiotu i każdy plugin porównywałby sobie, czy to nie jest przypadkiem ten nasz numerek. Wygodniej w oprogramowaniu, trochę dynamiczniej i możliwość wprowadzenia przez jeden plugin do menu kilku pozycji bezproblemowo. No i możliwość dodatkowa się pojawia, aby na jeden item reagowało kilka pluginów :)
Odpowiedz

  • +
  • -
Fili:P - zdjęcie Fili:P 17.12.2012

Ogólnie myślę że nie pomogę tak bardzo jak benio101 czy GwynBleidD, bo oni dali coś z siebie. Ja postaram się pomóc w inny sposób. Otóż pamiętałem jak kiedyś MisieQ opublikował Shop Api. Na początku nie mogłem, lecz w końcu je znalazłem, aby je zobaczyć kliknij w ten link.

Jeżeli jednak chciałbyś zobaczyć oryginalną wersję postu wejdź tu: Shop System + API - AlliedModders
Myślę że może ci to API pomóc w twoich celach. Mam nadzieję że pomogłem chodź w małym stopniu.

Pozdrawiam.
Odpowiedz

  • +
  • -
Krytykiewicz - zdjęcie Krytykiewicz 17.12.2012

Oczywiście, każda informacja się liczy.

Pozdrawiam.
Odpowiedz

  • +
  • -
Krytykiewicz - zdjęcie Krytykiewicz 25.12.2012

Witajcie,

Mam kolejne pytanie. Jeśli chciałbym zrobić, aby dla CT i TT były inne itemy, więc zrobić to w jednej natywie czy osobno natywa dla CT i TT?
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 26.12.2012

Jak Ci wygodniej :) Robiąc w jednym natywie możesz szybko rozszerzyć do kilku dodatkowych rzeczy. Dodatkowo możesz np przekazać do funkcji TEAM_TT|TEAM_CT żeby dodać do obu drużyn do menu coś za jednym zamachem :) Oczywiście musisz to odpowiednio obsłużyć ;)
Odpowiedz

  • +
  • -
Krytykiewicz - zdjęcie Krytykiewicz 26.12.2012

Chciałem zrobić to w jednej natywie, gdzie np.

item_info(opis, cos, cos, TEAM ? CT : TT, ...)

Tzn. w tym momencie napisałbym TEAM_CT bądź TEAM_TT. Tak myślę, że będzie dobrze oraz wygodnie :) Dodatkowo, mam jeszcze malutki problem. Ponieważ nikt mi jeszcze nie napisał przykładu, jak zrobić, aby dodać do menu item. Ten shop_api mi kompletnie nie podchodzi. benio napisał mi pobieranie informacji, natomiast jak zrobić aby dodać item do menu już nie, a o to mi tylko chodziło. Całą resztę sobie ogarnąłem jeszcze przed napisaniem tego wątku. Jestem wdzięczny za każdą pomoc, lecz z dodawaniem itemu do menu mam poważny problem, bo kompletnie nie potrafię tego zinterpretować. Proszę o wyrozumiałość, gdyż pierwszy raz robię takie coś :)
Użytkownik Krytykiewicz edytował ten post 26.12.2012 00:51
Odpowiedz

  • +
  • -
Fili:P - zdjęcie Fili:P 26.12.2012

Stworzyłem specjalnie dla ciebie shop api :)
Oto jego kod:
Spoiler

Jeżeli chcesz zmienić komendę otwierającą sklep zamień ją w lini:
#define KOMENDA "say /sklep"


Tworzenie itemów
W plugin_init rejestrujemy przedmiot:
item_register( "Gold M4", 10000 /* to oznacza że zapłacimy 10000$ */, TEAM_CT );

W 3 argumencie możemy użyć sumy bitowej :)
Wartości to TEAM_TT i TEAM_CT.

Wykrycie kupna itemu
Nie miałem pojęcia, czy chcesz aby item był na runde czy na ile, więc po prostu wywołuje się forward podczas kupna przedmiotu a zabierasz go gdy chcesz.
public item_buy( id, item )
{
// gracz kupil item
}


Przykładowy item - Smoke
#include <amxmodx>
#include <fun>

native item_register( nazwa[ 32 ], koszt, team );
new item_id;

public plugin_init() {
register_plugin("", "", "")
item_id = item_register( "Smoke grenade", 100, TEAM_CT|TEAM_TT );
}
public item_buy( id, item )
{
if( item != item_id )
return 0;
give_item( id, "weapon_smokegrenade" );
}
Odpowiedz

  • +
  • -
Krytykiewicz - zdjęcie Krytykiewicz 26.12.2012

Niepotrzebnie, ale wielkie wielkie dzięki! Jesteś super, skorzystam na pewno!
Tylko wywala błędy tag mismatch
if( !( (1<<ArrayGetCell( team_item, i )) & (1<<get_user_team( id ) ) ) )
if( !( (1<<ArrayGetCell( team_item, i )) & (1<<get_user_team( id ) ) ) )
oraz
cs_set_user_money( id, cs_get_user_money( id ) - ArrayGetCell( koszt_item, i ) );


Na pewno będę się starał teraz czytać i nauczyć o "Array", bo coraz więcej widzę osób używa tego ( http://amxx.pl/topic...miczne-tablice/ ).
Użytkownik Krytykiewicz edytował ten post 26.12.2012 12:21
Odpowiedz

  • +
  • -
Fili:P - zdjęcie Fili:P 26.12.2012

Pokaż logi kompilacji, bo u mnie wszystko ok i zero warningów.
Odpowiedz

  • +
  • -
Krytykiewicz - zdjęcie Krytykiewicz 26.12.2012

Tag mismatch wywala błąd podczas kompilacji lokalnej w tych funkcjach co podałem wyżej (natomiast jeśli skompiluje na amxx.pl to to działa). Przed chwilą zamieniłem pliki inc na inne z 1.8.1 amxmodx i nadal wywala błąd. Więc coś musi być od mojego kompilatora lokalnego. Cóż, wychodzę na idiotę, bo taka prosta sprawa i robię zamieszanie ośmieszając się. Niemniej jednak pierwszy raz zdarzyła mi się taka sytuacja.
Użytkownik Krytykiewicz edytował ten post 26.12.2012 12:50
Odpowiedz

  • +
  • -
Krytykiewicz - zdjęcie Krytykiewicz 26.12.2012

Poradziłem sobie, należało zrobić zmienną new cost = ArrayGetCell(koszt_item, id). Proszę nie zamykać jeszcze tematu :)
Użytkownik Krytykiewicz edytował ten post 26.12.2012 14:42
Odpowiedz

  • +
  • -
Fili:P - zdjęcie Fili:P 26.12.2012

Poradziłem sobie, należało zrobić zmienną new cost = ArrayGetCell(koszt_item, id). Proszę nie zamykać jeszcze tematu :)

Nie zadziała id, ma być tam i, ponieważ to się dzieje w pętli :)
Odpowiedz

  • +
  • -
Krytykiewicz - zdjęcie Krytykiewicz 19.01.2013

Cóż od pewnego czasu mam problem z tym że nie pojawiają się itemy w menu, to samo w oryginalnym kodzie podanym wyżej przez Fiii.

Oto kod (tam gdzie jest "test" oczywiście pojawia się tekst):

Spoiler

Użytkownik Krytykiewicz edytował ten post 19.01.2013 18:25
Odpowiedz

  • +
  • -
Krytykiewicz - zdjęcie Krytykiewicz 20.01.2013

Bardzo proszę o pomoc w tej sprawie!
benio101 powinien zaradzić ;/
Użytkownik Krytykiewicz edytował ten post 20.01.2013 18:43
Odpowiedz

Gość_21977_* 20.01.2013

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Temat zamknięty na prośbę użytkownika.


Z pozdrowieniami,
Zespół AMXX.PL
Odpowiedz
Zablokowany