←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

Inny
Problem z pluginem menu kupywania.

  • +
  • -
Ziome3eg - zdjęcie Ziome3eg 21.11.2017

Witam, mam problem ze zrobieniem własnego pluginu tj. Proste Menu Kupywania.
Problem tkwi w tym,że po kliknięciu b nie otwiera się moje menu lecz oryginalne,ustawienie otwierania podmiana komendy na buy nie pomaga.

Sma:
 

#include <amxmodx>

#include <amxmisc>
#include <cstrike>
#include <fun>
#include <colorchat>
#include <fakemeta>
 
 
#define PLUGIN "Menu Kupywania"
#define VERSION "1.0"
#define AUTHOR "Ziome3eg"
 
public plugin_init() 
{
register_plugin(PLUGIN, VERSION, AUTHOR)
 
 
register_clcmd("say /buy", "BuyMenu");
register_clcmd("say_team /buy", "BuyMenu");
register_clcmd("buy", "BuyMenu")
 
}
 
public plugin_precache()
{
precache_sound("weapons/c4_disarm.wav");
precache_sound("weapons/c4_disarmed.wav");
}
 
public BuyMenu (id)
{
if(is_user_alive(id)) {
MenuKupywania(id);
}
else {
ColorChat( id, TEAM_COLOR, "^x04[nazwamoda]^x03 Musisz byc zywy, aby korzystac ze sklepu!");
}
return PLUGIN_HANDLED;
}
 
public MenuKupywania(id)
{
switch(get_user_team(id))
{
case 1: MenuKupywaniaTT(id);
case 2: MenuKupywaniaCT(id);
}
 
 
return PLUGIN_HANDLED;
}
 
public MenuKupywaniaTT(id)
{
new menu = menu_create("Menu Kupywania:", "Handel_Menu");
 
menu_additem(menu, "\wKamizelka^t^t^t^t\y[\r650$\y]", "0");
menu_additem(menu, "\wKamizelka+Helm^t^t^t^t\y[\r1000$\y]", "1");
menu_additem(menu, "\wGranat Oslepiajacy^t^t^t^t\y[\r200$\y]", "2");
menu_additem(menu, "\wGranat Wybuchowy^t^t^t^t\y[\r300$\y]", "3");
menu_additem(menu, "\wGranat Dymny^t^t^t^t\y[\r300$\y]", "4");
 
menu_setprop(menu, MPROP_EXITNAME, "Wyjdz");
menu_display(id, menu);
}
 
public MenuKupywaniaCT(id)
{
new menu = menu_create("Menu Kupywania:", "Handel_Menu");
 
menu_additem(menu, "\wKamizelka^t^t^t^t\y[\r650$\y]", "0");
menu_additem(menu, "\wKamizelka+Helm^t^t^t^t\y[\r1000$\y]", "1");
menu_additem(menu, "\wGranat Oslepiajacy^t^t^t^t\y[\r200$\y]", "2");
menu_additem(menu, "\wGranat Wybuchowy^t^t^t^t\y[\r300$\y]", "3");
menu_additem(menu, "\wGranat Dymny^t^t^t^t\y[\r300$\y]", "4");
menu_additem(menu, "\wZestaw Do Rozbrajania^t^t^t^t\y[\r200$\y]", "5");
 
menu_setprop(menu, MPROP_EXITNAME, "Wyjdz");
menu_display(id, menu);
}
 
 
 
public Menu_Callback(id, menu, item)
{
static num[10], acces, callback;
menu_item_getinfo(menu, item, acces, num, 9, _, _, callback);
 
}
 
 
public Handel_Menu(id, menu, item)
{
if(item == MENU_EXIT)
return;
 
new kasa = cs_get_user_money(id)
new num[10], acces, callback;
menu_item_getinfo(menu, item, acces, num, 9, _, _, callback);
if(!is_user_alive(id)){
ColorChat(id, RED, "^x04[nazwamoda]^x03 Jestes martwy, jak chcesz cos kupic?");
return;
}
switch(str_to_num(num))
{
 
case 0: { 
if(kasa>=650 && is_user_alive(id)){ColorChat(id, TEAM_COLOR, "^x04[nazwamoda]^x03 Kupiles Kamizelke!");cs_set_user_armor(id, 100, CS_ARMOR_KEVLAR);cs_set_user_money(id, kasa - 650);}
else {ColorChat(id, TEAM_COLOR, "^x04[nazwamoda]^x03 Nie masz tyle pieniedzy!");}}
case 1: { 
if(kasa>=1000 && is_user_alive(id)){ColorChat(id, TEAM_COLOR, "^x04[nazwamoda]^x03 Kupiles Kamizelke i helm!");cs_set_user_armor(id, 100, CS_ARMOR_VESTHELM);cs_set_user_money(id, kasa - 1000);}
else {ColorChat(id, TEAM_COLOR, "^x04[nazwamoda]^x03 Nie masz tyle pieniedzy!");}}
case 2: { 
if(kasa>=200 && is_user_alive(id)){ColorChat(id, TEAM_COLOR, "^x04[nazwamoda]^x03 Kupiles Flesza!");give_item(id, "weapon_flashbang");cs_set_user_money(id, kasa - 200);}
else {ColorChat(id, TEAM_COLOR, "^x04[nazwamoda]^x03 Nie masz tyle pieniedzy!");}}
case 3: { 
if(kasa>=300 && is_user_alive(id)){ColorChat(id, TEAM_COLOR, "^x04[nazwamoda]^x03 Kupiles HE!");give_item(id, "weapon_hegrenade");cs_set_user_money(id, kasa - 300);}
else {ColorChat(id, TEAM_COLOR, "^x04[nazwamoda]^x03 Nie masz tyle pieniedzy!");}}
case 4: { 
if(kasa>=300 && is_user_alive(id)){ColorChat(id, TEAM_COLOR, "^x04[nazwamoda]^x03 Kupiles Smoke!");give_item(id, "weapon_smokegrenade");cs_set_user_money(id, kasa - 300);}
else {ColorChat(id, TEAM_COLOR, "^x04[nazwamoda]^x03 Nie masz tyle pieniedzy!");}}
case 5: { 
if(kasa>=200 && is_user_alive(id)){ColorChat(id, TEAM_COLOR, "^x04[nazwamoda]^x03 Kupiles Defa!");cs_set_user_defuse(id, 1);cs_set_user_money(id, kasa - 200);}
else {ColorChat(id, TEAM_COLOR, "^x04[nazwamoda]^x03 Nie masz tyle pieniedzy!");}}
 
 
}
 
 
 
}
 



Za każdą chęć pomocy polecą +++!

 

Edit1:A i pomoże ktoś jeszcze dodać ten dźwięk z menu klas codmoda przy otwarciu menu i klinięciu opcji?
Edit2: I dodaniem ,że można kupywać tylko w buyzone i tylko po rozpoczęciu rundy 90 sekund to działa(jak normalny buyzone) po 90 sekundach pojawiałoby się : "{ColorChat(id, TEAM_COLOR, "^x04[nazwamoda]^x03 Kupywac mozna tylko przez 90 sekund rundy!");}}"


Użytkownik Ziome3eg edytował ten post 21.11.2017 00:18
Odpowiedz

  • +
  • -
Ziome3eg - zdjęcie Ziome3eg 21.11.2017

Wie ktoś co mogłem zrobić źle ?

 

Odpowiedz

  • +
  • -
Mixtaz - zdjęcie Mixtaz 21.11.2017

Teraz tak:

 

Pare rzeczy sobie wypiszmy - zamiana motd z buyem na wlasne menu, doklej to do pluga:

public plugin_init()
{
	register_clcmd("client_buy_open","BuyOpen")
}

public BuyOpen(id)
{
	if(!is_user_alive(id))	return PLUGIN_CONTINUE

	static msg_buyclose
	if(!msg_buyclose)	msg_buyclose = get_user_msgid("BuyClose")
	
	message_begin(MSG_ONE, msg_buyclose, _, id)
	message_end()
	
	CommandBuy(id)

	return PLUGIN_CONTINUE
}

public CommandBuy(id)
{
	client_cmd(id, "say /buy);
}

Ponieważ serwer nie wychwyci komendy buy z poziomu klienta ze względu na ograniczenie hl.

 

Teraz zakup wyłącznie w buyzone:

 

Do BuyMenu(id)

else if(!fm_get_user_buyzone(id)){
ColorChat(id, TEAM_COLOR, "^x04[nazwamoda]^x03 Kupiles poza buyzonem.);
}

//Na końcu kodu:

stock fm_get_user_buyzone(id)
{
	if (get_pdata_int(id, OFFSET_MAPZONE) & PLAYER_IN_BUYZONE)
		return 1;
	
	return 0;
}

Co do dźwięków z CoD'a to Ci nie pomogę, bo się w tym nie orientuję.

 

I dodam, że funkcja plugin_precache jest zbędna ponieważ w kodzie nie ma nic co mogłoby wywołać te dźwięki.

 

Zapomniałbym, jest możliwość zbindowania każdemu graczowi przy połączeniu Twój sklep, zamiast normalnego buy'a, ale jest to ​pogwałcenie​ regulaminu forum.

Odpowiedz

  • +
  • -
Ziome3eg - zdjęcie Ziome3eg 21.11.2017

Teraz tak:

 

Pare rzeczy sobie wypiszmy - zamiana motd z buyem na wlasne menu, doklej to do pluga:

public plugin_init()
{
	register_clcmd("client_buy_open","BuyOpen")
}

public BuyOpen(id)
{
	if(!is_user_alive(id))	return PLUGIN_CONTINUE

	static msg_buyclose
	if(!msg_buyclose)	msg_buyclose = get_user_msgid("BuyClose")
	
	message_begin(MSG_ONE, msg_buyclose, _, id)
	message_end()
	
	CommandBuy(id)

	return PLUGIN_CONTINUE
}

public CommandBuy(id)
{
	client_cmd(id, "say /buy);
}

Ponieważ serwer nie wychwyci komendy buy z poziomu klienta ze względu na ograniczenie hl.

 

Teraz zakup wyłącznie w buyzone:

 

Do BuyMenu(id)

else if(!fm_get_user_buyzone(id)){
ColorChat(id, TEAM_COLOR, "^x04[nazwamoda]^x03 Kupiles poza buyzonem.);
}

//Na końcu kodu:

stock fm_get_user_buyzone(id)
{
	if (get_pdata_int(id, OFFSET_MAPZONE) & PLAYER_IN_BUYZONE)
		return 1;
	
	return 0;
}

Co do dźwięków z CoD'a to Ci nie pomogę, bo się w tym nie orientuję.

 

I dodam, że funkcja plugin_precache jest zbędna ponieważ w kodzie nie ma nic co mogłoby wywołać te dźwięki.

 

Zapomniałbym, jest możliwość zbindowania każdemu graczowi przy połączeniu Twój sklep, zamiast normalnego buy'a, ale jest to ​pogwałcenie​ regulaminu forum.

JESTEŚ BOGIEM!!!
Co do bindowania innym właśnie chodziło mi tylko żeby to podmieniało a nie zmieniało komendę.

Repka leci za pomoc i czekam bo może ktoś pomoże z dźwiękami :P
 

Odpowiedz

  • +
  • -
Ziome3eg - zdjęcie Ziome3eg 21.11.2017

A dałbyś rade zrobić to ?:
"Edit2: I dodaniem ,że można kupywać tylko w buyzone i tylko po rozpoczęciu rundy 90 sekund to działa(jak normalny buyzone) po 90 sekundach pojawiałoby się : "{ColorChat(id, TEAM_COLOR, "^x04[nazwamoda]^x03 Kupywac mozna tylko przez 90 sekund rundy!");}}""

Odpowiedz

  • +
  • -
Ziome3eg - zdjęcie Ziome3eg 22.11.2017

Ups wypadają errory podczas kompilacji

 

Odpowiedz

  • +
  • -
Mixtaz - zdjęcie Mixtaz 22.11.2017

Wypadaly minimalne błędy, wczoraj wieczorem to robiłem, więc mogły jakieś małe błędy wystąpić.

 

Nie będę się rozpisywać (bo dość szeroko pojęte zmiany zaszły) i wyślę Ci .sma w załączniku. Kompiluje się bez problemu.

 

Co do tego dźwięku w menu to mam pewien pomysł w głowie, ale z tym byłoby sporo pracy.

 

Enjoy.

 

 

Załączone pliki

Odpowiedz

  • +
  • -
Ziome3eg - zdjęcie Ziome3eg 22.11.2017

Wypadaly minimalne błędy, wczoraj wieczorem to robiłem, więc mogły jakieś małe błędy wystąpić.

 

Nie będę się rozpisywać (bo dość szeroko pojęte zmiany zaszły) i wyślę Ci .sma w załączniku. Kompiluje się bez problemu.

 

Co do tego dźwięku w menu to mam pewien pomysł w głowie, ale z tym byłoby sporo pracy.

 

Enjoy.

Dzięki pogrzebie w menu coda i jak do łapię to wstawię tu kod dla przyszłych pokoleń :D

Odpowiedz

  • +
  • -
Ziome3eg - zdjęcie Ziome3eg 22.11.2017

Wypadaly minimalne błędy, wczoraj wieczorem to robiłem, więc mogły jakieś małe błędy wystąpić.

 

Nie będę się rozpisywać (bo dość szeroko pojęte zmiany zaszły) i wyślę Ci .sma w załączniku. Kompiluje się bez problemu.

 

Co do tego dźwięku w menu to mam pewien pomysł w głowie, ale z tym byłoby sporo pracy.

 

Enjoy.

Nie pojawia się wiadomość poza buyzonem i to domyślne menu kupywania mruga, jakiś pomysł ?

Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 22.11.2017

Napisałem Ci to od zera, ale nie bawiłem się z blokowaniem komendy "buy".

 

Załączone pliki

Odpowiedz

  • +
  • -
Mixtaz - zdjęcie Mixtaz 22.11.2017

Napisałem Ci to od zera, ale nie bawiłem się z blokowaniem komendy "buy".

 

Słusznie, że napisałeś od zera bo operowanie pierwotnym pluginem było ciężkie (niepotrzebne przejścia I ta "tabulacja"). Już się brałem za fixa, bo widziałem na czym opierał się mój błąd.

 

Dodam od siebie, że kodzik ładnie napisany (dużo inkrementacji), ale są no, powiedzmy rzeczy które mogłyby ujednolicić jedno czy drugie

 

1.

for(new i=0;i<get_maxplayers();i++){
		if(is_user_connected(i)){

No dobrze, ale dla takiej pętli warto również dodać warunek czy gracz jest połączony z serwerem.

 

Kolejna sprawa która skróciła I "upiększyła" kod jest taki stock:

stock Reduce(id, amount)
    cs_set_user_money(id, cs_get_user_money(id) - amount)  

Chociaż nie wiem czy gra warta świeczki bo widzę, że funkcja występuje tylko raz.

 

No, ale to są kwestie małostkowe, plusik za zdjęcie obowiązku pracy z moich barków.​

Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 22.11.2017

 

Napisałem Ci to od zera, ale nie bawiłem się z blokowaniem komendy "buy".

 

Słusznie, że napisałeś od zera bo operowanie pierwotnym pluginem było ciężkie (niepotrzebne przejścia I ta "tabulacja"). Już się brałem za fixa, bo widziałem na czym opierał się mój błąd.

 

Dodam od siebie, że kodzik ładnie napisany (dużo inkrementacji), ale są no, powiedzmy rzeczy które mogłyby ujednolicić jedno czy drugie

 

1.

for(new i=0;i<get_maxplayers();i++){
		if(is_user_connected(i)){

No dobrze, ale dla takiej pętli warto również dodać warunek czy gracz jest połączony z serwerem.

 

Kolejna sprawa która skróciła I "upiększyła" kod jest taki stock:

stock Reduce(id, amount)
    cs_set_user_money(id, cs_get_user_money(id) - amount)  

Chociaż nie wiem czy gra warta świeczki bo widzę, że funkcja występuje tylko raz.

 

No, ale to są kwestie małostkowe, plusik za zdjęcie obowiązku pracy z moich barków.​

 

 

Z pętlą masz rację, moja logika podczas pisania zakładała, że pętla wykona się tyle razy ile serwer ma max. slotów i jednocześnie tyle ile jest graczy - dopiero teraz widzę błąd :)

Starałem się zmieścić to w jak najmniejszej ilości funkcji, dlatego też consty, zamiast robienia wszystkiego dla konkretnego itemu. Oczywiście do menu można też dodać ceny przedmiotów - wystarczy zmienić public BuyMenu na

Spoiler
Odpowiedz

  • +
  • -
Ziome3eg - zdjęcie Ziome3eg 22.11.2017

dobra dla przyszłych pokoleń dołapałem się do kodu dźwieku wyboru z coda:

 

To:

client_cmd(id, "spk menu/select");

dodajemy w:

public nazwamenu(id)

pod 

menu_display(id, menu);

i do 

public nazwamenu_Handle(id)

dodajemy to jako pierwsze.

jeszcze do

public plugin_precache()/sma]

[sma]precache_sound("menu/select.wav");[

 

Załączone pliki


Użytkownik Ziome3eg edytował ten post 22.11.2017 21:26
Odpowiedz

  • +
  • -
Ziome3eg - zdjęcie Ziome3eg 22.11.2017

 

 

Napisałem Ci to od zera, ale nie bawiłem się z blokowaniem komendy "buy".

 

Słusznie, że napisałeś od zera bo operowanie pierwotnym pluginem było ciężkie (niepotrzebne przejścia I ta "tabulacja"). Już się brałem za fixa, bo widziałem na czym opierał się mój błąd.

 

Dodam od siebie, że kodzik ładnie napisany (dużo inkrementacji), ale są no, powiedzmy rzeczy które mogłyby ujednolicić jedno czy drugie

 

1.

for(new i=0;i<get_maxplayers();i++){
		if(is_user_connected(i)){

No dobrze, ale dla takiej pętli warto również dodać warunek czy gracz jest połączony z serwerem.

 

Kolejna sprawa która skróciła I "upiększyła" kod jest taki stock:

stock Reduce(id, amount)
    cs_set_user_money(id, cs_get_user_money(id) - amount)  

Chociaż nie wiem czy gra warta świeczki bo widzę, że funkcja występuje tylko raz.

 

No, ale to są kwestie małostkowe, plusik za zdjęcie obowiązku pracy z moich barków.​

 

 

Z pętlą masz rację, moja logika podczas pisania zakładała, że pętla wykona się tyle razy ile serwer ma max. slotów i jednocześnie tyle ile jest graczy - dopiero teraz widzę błąd :)

Starałem się zmieścić to w jak najmniejszej ilości funkcji, dlatego też consty, zamiast robienia wszystkiego dla konkretnego itemu. Oczywiście do menu można też dodać ceny przedmiotów - wystarczy zmienić public BuyMenu na

Spoiler

 

niestety twój plugin mi nie działa

Odpowiedz

  • +
  • -
Ziome3eg - zdjęcie Ziome3eg 22.11.2017

Dobra już działa ale wciąż bawię się w blokadę buya


Użytkownik Ziome3eg edytował ten post 22.11.2017 23:02
Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 22.11.2017

Możesz zaryzykować mp_buytime 0.1 i ustawić własną wartość float w set_task'u.

Odpowiedz

  • +
  • -
Ziome3eg - zdjęcie Ziome3eg 22.11.2017

Możesz zaryzykować mp_buytime 0.1 i ustawić własną wartość float w set_task'u.

dokładniej można z tym floatem bo ja jestem zielony mimo wszystko xD

Odpowiedz

  • +
  • -
Ziome3eg - zdjęcie Ziome3eg 23.11.2017

dobra float zrobiony, ale dalej nie otwiera sie moje menu po kliknięciu b

Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 23.11.2017

Nie wrzuciłem tam w ogóle komendy buy.

Odpowiedz

  • +
  • -
Ziome3eg - zdjęcie Ziome3eg 23.11.2017

dodałem register_clcmd("client_buy_open","BuyHandler")
ale cały czas plugin podczas pobytu w buyzone wyświetla mi, że nie mogę już kupować

Odpowiedz