#include <amxmodx>
#include <fakemeta>
#include <naxe_jailbreak>

new ent[33], gNazwaAktualnej[33][128];
new Array:gModel, Array:gNazwa, Array:gBody;

public plugin_init() {
	register_plugin("Czapki", "1.2", "naXe");

	register_clcmd("say /hat", "MenuHat");
	register_clcmd("say /hats", "MenuHat");
	register_clcmd("say /czapki", "MenuHat");
	register_clcmd("say /czapka", "MenuHat");
}

public plugin_precache() {
	gModel = ArrayCreate(128);
	gNazwa = ArrayCreate(64);
	gBody = ArrayCreate();

	ArrayPushString(gModel, "Zadna");
	ArrayPushString(gNazwa, "\dZdejmij czapke");
	ArrayPushCell(gBody, 0);

	new configfile[] = "addons/amxmodx/configs/czapki.ini";

	if(!file_exists(configfile)) return;

	new linia[256], txtlen, ilosc;
	for(new i; i < file_size(configfile, 1); i++) {
		read_file(configfile, i, linia, 255, txtlen);
		if(contain(linia, ";") != -1 || !txtlen) continue;

		new model[128], nazwa[64], body[6], gmodel[64];
		parse(linia, model, 127, nazwa, 63, body, 5);
		remove_quotes(model);
		remove_quotes(nazwa);
		remove_quotes(body);
		format(model, 127, "models/topmasters_jb/%s", model);

		ArrayPushString(gModel, model);
		ArrayPushString(gNazwa, nazwa);
		ArrayPushCell(gBody, str_to_num(body));

		if(ilosc) {
			for(new j = 1; j < ArraySize(gBody) - 1; j++) {
				ArrayGetString(gModel, j, gmodel, 63);
				if(equal(model, gmodel)) {
					gmodel[0] = 1;
					break;
				}
				else gmodel[0] = 0;
			}
		}
		if(!gmodel[0]) precache_model(model);

		ilosc++;
	}
}

public OnPlayerConnected(id) formatex(gNazwaAktualnej[id], 127, "Brak");

public MenuHat(id) {
	new text[128]; formatex(text, 127, "Masz teraz: \r%s^n^n\wWybierz czapke:", gNazwaAktualnej[id]);
	new nazwa[64], int[4], cb, menu = menu_create(text, "HandelCzapki");
	cb = menu_makecallback("HatCallback");
	for(new i; i < ArraySize(gBody); i++) {
		num_to_str(i, int, 3);
		ArrayGetString(gNazwa, i, nazwa, 63);
		menu_additem(menu, nazwa, int, .callback=cb);
	}
	menu_setprop(menu, 2, "Poprzednia strona");
	menu_setprop(menu, 3, "Nastepna strona");
	menu_setprop(menu, 4, "Wyjdz");
	menu_display(id, menu);
	return 1;
}

public HatCallback(id, menu, item) {
	new nazwa[64]; ArrayGetString(gNazwa, item, nazwa, 63);

	if(equal(gNazwaAktualnej[id], "Brak") && !item) return 2;
	if(equal(gNazwaAktualnej[id], nazwa)) return 2;
	if(containi(nazwa, "\y") != -1 && !userFlags(id, "r, v")) return 2;
	if(containi(nazwa, "\r") != -1 && !userFlags(id, "s, t, v")) return 2;
	if(equali(nazwa, "Jednorozec") && !userFlags(id, "v"))  return 2;

	return 1;
}

public HandelCzapki(id, menu, item) {
	if(item == -3 || !is_user_alive(id)) return;

	static acces, cb, num[4], nazwa[64];
	menu_item_getinfo(menu, item, acces, num, 3, nazwa, 63, cb);

	if(containi(nazwa, "\y") != -1 || containi(nazwa, "\r") != -1) {
		replace_all(nazwa, 63, "\r[VIP]", "");
		replace_all(nazwa, 63, "\y[PLATNA]", "");
	}
	UstawCzapke(id, str_to_num(num));
	formatex(gNazwaAktualnej[id], 127, "%s", item ? nazwa : "Brak");
	ColorChat(id, 0, "^4[Czapki]^1 Z%s czapke:^3 %s", item ? "alozyles" : "djales", item ? nazwa : "Brak");
}

stock UstawCzapke(id, num) {
	if(ent[id]) set_pev(ent[id], 73, num ? pev(ent[id], 73) & ~128 : pev(ent[id], 73) | 128);

	if(!num) return;

	static model[128]; ArrayGetString(gModel, num, model, 127);

	if(!ent[id]) {
		ent[id] = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
		set_pev(ent[id], 69, 12);
		set_pev(ent[id], 17, id);
		set_pev(ent[id], 77, 0);
	}
	engfunc(EngFunc_SetModel, ent[id], model);	
	set_pev(ent[id], 72, ArrayGetCell(gBody, num));
}