Problema Shop Puncte

Tutoriale scripting, cod si portiuni de cod.

Moderators: Moderatori ajutatori, Moderatori, Echipa eXtreamCS.com

Post Reply
stanemir.andrei
Membru, skill 0
Membru, skill 0
Posts: 57
Joined: 13 May 2023, 16:29
Detinator Steam: Nu
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Discord: -
Has thanked: 11 times
Been thanked: 4 times

31 May 2023, 14:48

Salut am modificat un plugin cu puncte pentru a implementa un shop problema este ca , la achizitionarea unui item din shop mesajul nu este afisat si nici punctele nu scad

Code: Select all

#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fun>


new const PLUGIN[] = "Points";
new const VERSION[] = "1.3";
new const AUTHOR[] = "Alex #";

new Points[33];
new SaveDataFile[128];

const Float:HUD_SPECT_X = 0.1;
const Float:HUD_SPECT_Y = 0.2;

enum ShopItems
{
    ITEM_MACHETE,
    ITEM_BAK_KNIFE,
    ITEM_POCKET_KNIFE,
    ITEM_BUTCHER_KNIFE,
    ITEM_DEFAULT_KNIFE,
    ITEM_EXIT
};

new const SHOP_ITEM_PRICE[5] =
{
    5,
    10,
    8,
    15,
    12
};


public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);

    register_event("DeathMsg", "eDeath", "a");

    new DataDir[64];
    get_configsdir(DataDir, charsmax(DataDir));
    format(SaveDataFile, 127, "%s/Points.dat", DataDir);

    set_task(0.1, "TASK_MSG", _, _, _, "b");

    register_clcmd("say /shop", "menuShopDisplay");
    register_menucmd(register_menuid("\r[<><><><>] - \w[DR SHOP]\n\n"), 1023, "menuShopAction");
}

public plugin_natives()
{
    register_native("csdm_get_user_points", "get_user_points", 1);
    register_native("csdm_set_user_points", "set_user_points", 1);
}

public get_user_points(id)
{
    return Points[id];
}

public set_user_points(id, PointsNum)
{
    Points[id] = PointsNum;
}

public eDeath(id)
{
    new Killer = read_data(1);
    new Victim = read_data(2);
    new HeadShoot = read_data(3);

    if (Killer == Victim)
        return PLUGIN_HANDLED;

    Points[Killer] += 2;
    if (HeadShoot)
    {
        Points[Killer] += 2;
    }

    return PLUGIN_CONTINUE;
}

public client_connect(id)
{
    LoadPoints(id);
}

public LoadPoints(id)
{
    new Name[32];
    get_user_name(id, Name, 31);

    new Line[128], IsPlayer = false, Arg1[32], Arg2[32];
    new File = fopen(SaveDataFile, "rt");
    while (!feof(File))
    {
        fgets(File, Line, 127);
        trim(Line);

        parse(Line, Arg1, 31, Arg2, 31);

        if (equali(Arg1, Name))
        {
            Points[id] = str_to_num(Arg2);
            IsPlayer = true;
            break;
        }
    }

    fclose(File);

    if (!IsPlayer)
        Points[id] = 0;
}

public SavePoints(id)
{
    new Name[32];
    get_user_name(id, Name, 31);

    new Save[1024];
    format(Save, sizeof(Save) - 1, "^"%s^" %d", Name, Points[id]);

    new Line[128], Linie, IsPlayer = false, Arg1[32]

    new File = fopen(SaveDataFile, "rt");
    while (!feof(File))
    {
        fgets(File, Line, 127);

        parse(Line, Arg1, 31);

        if (equali(Arg1, Name))
        {
            write_file(SaveDataFile, Save, Linie);
            IsPlayer = true;
            break;
        }

        Linie++
    }

    fclose(File);

    if (!IsPlayer)
        write_file(SaveDataFile, Save, -1);
}

public TASK_MSG()
{
    static id;
    for (id = 1; id <= get_maxplayers(); id++)
    {
        if (is_user_alive(id) && is_user_connected(id))
        {
            switch (cs_get_user_team(id))
            {
            case CS_TEAM_T:
            {
                set_hudmessage(id, 127, 255, HUD_SPECT_X, HUD_SPECT_Y, 1, 6.0, 1.1, 0.0, 0.0, -1);
                show_hudmessage(id, "[DR CREDITS]: %d", Points[id]);
            }

            case CS_TEAM_CT:
            {
                set_hudmessage(id, 127, 255, HUD_SPECT_X, HUD_SPECT_Y, 1, 6.0, 1.1, 0.0, 0.0, -1);
                show_hudmessage(id, "[DR CREDITS]: %d", Points[id]);
            }

            case CS_TEAM_SPECTATOR:
            {
                return PLUGIN_CONTINUE;
            }
            }
        }
    }
    return PLUGIN_CONTINUE;
}


public menuShopDisplay(id)
{
    new menu[256];
    new len = formatex(menu, sizeof(menu) - 1, "\r[FPS] - \w[DR SHOP]^n^n");
    len += formatex(menu[len], sizeof(menu) - len - 1, "\r1. \wMachete: \y%.1d credits^n", SHOP_ITEM_PRICE);
    len += formatex(menu[len], sizeof(menu) - len - 1, "\r2. \wBak Knife: \y%.1d credits^n", SHOP_ITEM_PRICE);
    len += formatex(menu[len], sizeof(menu) - len - 1, "\r3. \wPocket Knife: \y%.1d credits^n", SHOP_ITEM_PRICE);
    len += formatex(menu[len], sizeof(menu) - len - 1, "\r4. \wButcher Knife: \y%.1d credits^n", SHOP_ITEM_PRICE);
    len += formatex(menu[len], sizeof(menu) - len - 1, "\r5. \wDefault Knife: \y%.1d credits^n", SHOP_ITEM_PRICE);
    len += formatex(menu[len], sizeof(menu) - len - 1, "^n\r0. \wIesire");
    show_menu(id, (1 << 0 | 1 << 1 | 1 << 9), menu, -1);

    return PLUGIN_HANDLED;
}

public menuShopAction(id, option)
{
    switch (option)
    {
    case ITEM_MACHETE:
        if (Points[id] >= SHOP_ITEM_PRICE[id])
        {
            Points[id] -= SHOP_ITEM_PRICE[id];
     
            client_print(id, print_chat, "Ai cumparat Machete!");
        }
        else
        {
            client_print(id, print_chat, "Nu ai suficiente puncte pentru a cumpara Machete!");
        }
       
    case ITEM_BAK_KNIFE:
        if (Points[id] >= SHOP_ITEM_PRICE[id])
        {
            Points[id] -= SHOP_ITEM_PRICE[id];
           
            client_print(id, print_chat, "Ai cumparat Bak Knife!");
        }
        else
        {
            client_print(id, print_chat, "Nu ai suficiente puncte pentru a cumpara Bak Knife!");
        }
        
    case ITEM_POCKET_KNIFE:
        if (Points[id] >= SHOP_ITEM_PRICE[id])
        {
            Points[id] -= SHOP_ITEM_PRICE[id];
            
            client_print(id, print_chat, "Ai cumparat Pocket Knife!");
        }
        else
        {
            client_print(id, print_chat, "Nu ai suficiente puncte pentru a cumpara Pocket Knife!");
        }
       
    case ITEM_BUTCHER_KNIFE:
        if (Points[id] >= SHOP_ITEM_PRICE[id])
        {
            Points[id] -= SHOP_ITEM_PRICE[id];
         
            client_print(id, print_chat, "Ai cumparat Butcher Knife!");
        }
        else
        {
            client_print(id, print_chat, "Nu ai suficiente puncte pentru a cumpara Butcher Knife!");
        }
       
    case ITEM_DEFAULT_KNIFE:
        if (Points[id] >= SHOP_ITEM_PRICE[id])
        {
            Points[id] -= SHOP_ITEM_PRICE[id];
           
            client_print(id, print_chat, "Ai cumparat Default Knife!");
        }
        else
        {
            client_print(id, print_chat, "Nu ai suficiente puncte pentru a cumpara Default Knife!");
        }
     case ITEM_EXIT:
       client_print(id, print_chat, "Ai iesit din shop");
        
    }

    return PLUGIN_HANDLED;
}
RoyalServer 2
lexz
Scripter eXtreamCS
Scripter eXtreamCS
Posts: 917
Joined: 02 Nov 2020, 01:57
Detinator Steam: Da
Fond eXtream: 0
Discord: lexzor#0630
Has thanked: 71 times
Been thanked: 136 times

31 May 2023, 16:52

salut, ti-am facut aici pluginul cu cateva explicatii

Code: Select all

#include <amxmodx>

static const PLUGIN[] = "Points";
static const VERSION[] = "1.3";
static const AUTHOR[] = "Alex #";

new Points[33];

enum (+= 1) // (+= 1) inseamna ca va incrementa fiecare "item" din enum cu 1. ca sa folosim aceasta "setare", trebuie sa ii spunem pluginului valoarea primului item din enum ca sa stie de unde incepe
	// de asemenea, punem un nume enumului atunci cand este folosit pentru o variabila. este un fel de dictionar al acesteia, aici nu e cazul
{
    ITEM_MACHETE = 0, // alege primul item din meniu, in vip_menu_handler va returna variabila "item" ca fiind 0. asa verificam
    ITEM_BAK_KNIFE, // aici alege al doilea item, va returna item ca fiind 1 si indentificam ca fiind acesta 
    ITEM_POCKET_KNIFE,
    ITEM_BUTCHER_KNIFE,
    ITEM_DEFAULT_KNIFE,
    ITEM_EXIT
};
// ps, enumul de mai sus este inutil deoarece putem folosii direct item in loc de asta,
// te-ar ajuta doar daca in switch(item) ai vrea ca in loc de case 0, case 1, sa scrii numele itemului, asa cum ai facut-o tu


new const SHOP_ITEM_PRICE[5] =
{
    5, // pozitia 0
    10, // pozitia 1
    8, // pozitia 2
    15, // pozitia 3
    12 // pozitia 4
	// pozitia 5 (adica cat pui acolo intre paranteze drepte) va trebui sa fie intotdeauna nepredefinita
	// pentru ca indica in memorie bitul 0, ceea ce inseamna ca acolo este finalul arrayului si nu poate fi schimbat, va retruna eroare la compilare daca este definit sau daca 
	// se incearca accesarea sa
};

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);

    register_event("DeathMsg", "eDeath", "a");

    register_clcmd("say /shop", "menuShopDisplay");
}

public menuShopDisplay(id)
{
	new iMenu = menu_create("\r[FPS] - \w[DR SHOP]", "vip_menu_handler")

	menu_additem(iMenu, "Machete: \y%.1d credits")
	menu_additem(iMenu, "Bak Knife: \y%.1d credits")
	menu_additem(iMenu, "Pocket Knife: \y%.1d credits")
	menu_additem(iMenu, "Butcher Knife: \y%.1d credits")
	menu_additem(iMenu, "Default Knife: \y%.1d credits")

	menu_setprop(iMenu, MPROP_EXIT, MEXIT_ALL)

	if(is_user_connected(id))
	{
		menu_display(id, iMenu)
	}
}

public vip_menu_handler(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(menu);
		return PLUGIN_HANDLED;
	}

	switch(item)
	{
		case ITEM_MACHETE: 
		{
			if(Points[id] > SHOP_ITEM_PRICE[ITEM_MACHETE])
			{
				client_print(id, print_chat, "Nu ai suficiente puncte pentru a cumpara Bak Knife!");
				return PLUGIN_CONTINUE;
			}

			Points[id] -= SHOP_ITEM_PRICE[ITEM_MACHETE]

			// SHOP_ITEM_PRICE[ITEM_MACHETE] este echivalentul SHOP_ITEM_PRICE[0] sau SHOP_ITEM_PRICE[item], toate avand aceeasi valoare in aceasta situatie
		}

		// si aici faci restul case-urilor dupa modelul de mai sus, sper ca ai inteles
	}

	return PLUGIN_CONTINUE;
}

// alta varianta ar fi ->
public vip_menu_handler(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(menu);
		return PLUGIN_HANDLED;
	}

	new szName[128]
	//preluam numele itemului din meniu asa cum este pus in menu_additem
	menu_item_getinfo(menu, item, _, _, _, szName, charsmax(szName), _)

	/*
		pentru ca numele din meniu este Machete: \y%.1d credits, va trebui sa gasim un token comun pentru toate itemele,

		in cazul tau acesta va fi ":"	 pentru ca toate sunt sub forma de nume: pret

		aici ai 2 variante pentru a face asta

		strtok2 (string token) si strlen() (la strlen nu iti mai arat exemplu)
	*/

	// strtok2

	new szItemName[64], szRightSide[64]

	// am adaugat iTokenPosition ca sa iti dai seama ca majoritatea nativelor returneaza o valoare
	// in cazul nostru returneaza pozitia tokenului ":" daca este gasit, si -1 daca nu este returnat
	// aici ce este in stanga : va fi copiat in szLeftSide si ce e in dreapta in szRightSide
	// in cazul nostru in leftside numele itemului si in righside restul stringului de dupa :
	new iTokenPosition = strtok2(szName, szItemName, charsmax(szItemName), szRightSide, charsmax(szRightSide), ':')


	//poti incerca sa scoti tu : din numele lor
	if(iTokenPosition)
	{
		server_print("Tokenul nu a fost gasit pentru itemul %s", szName)
		return PLUGIN_HANDLED
	}


	// verificam daca are mai putine puncte fata de cat costa itemul
	if(Points[id] < SHOP_ITEM_PRICE[item])
	{
		client_print(id, print_chat, "Nu poti cumpara %s, mai ai nevoie de %i puncte", szItemName, SHOP_ITEM_PRICE[item] - Points[id])
		return PLUGIN_HANDLED
	}

	Points[id] -= SHOP_ITEM_PRICE[item]

	client_print(id, print_chat, "Ai cumparat %s pentru %i puncte. Ai mai ramas cu %i", szItemName, SHOP_ITEM_PRICE[item], Points[id])

	return PLUGIN_CONTINUE;
}
tot ce ai nevoie gasesti pe site-ul asta: https://www.amxmodx.org/api/#

majoritatea nativelor din amxx au o denumire si functionalitate asemenatoare cu cele din c, c++, daca nu intelegi din documentatie incerci sa le cauti pe net

ai mai multe greseli in plugin, folosirea incorecta a nativelor pentru plugin (cele create de tine), o metoda impractica de a citii si salva datele

daca mai ai nevoie de ajutor sau de explicatii, postezi aici

off-topic: cat despre pluginul de dr pe care mi l-ai trimis in privat, nu aveam timp sa testez sau sa modific, insa in situatiile de genul cel mai bine este sa asculti sfaturile celor care iti raspund la topic, sa te documentezi si sa incerci singur, din cate vad iti cam place scriptingul, bafta in continuare :D
stanemir.andrei
Membru, skill 0
Membru, skill 0
Posts: 57
Joined: 13 May 2023, 16:29
Detinator Steam: Nu
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Discord: -
Has thanked: 11 times
Been thanked: 4 times

31 May 2023, 17:35

Mersi prietenul meu esti la fel de explicit ca intotdeauna si inteleg foarte bine ce spui treaba cu enum am aplicat-o de la tine de cand mi-ai explicat treaba cu Save si Load
Post Reply

Return to “Scripting”

  • Information
  • Who is online

    Users browsing this forum: No registered users and 14 guests