Jump to content

script Klikací menu (Textdrawy)


ExiRang

Recommended Posts

Zdravím vás.
 
S tvorbou věcí do SA-MP končím, takže se s vámi podělím o menu, které se mělo původně nacházet jen v módu The San Fierro City. S módem jsme však skončili z důvodu nedostatku času a nabývajícího odporu k tvorbě.
 
Skriptů mám dost, ale většinou jsou to takové blbůstky. Ovšem tento skript, se kterým se s vámi podělím, je škoda jen tak nechat ležet. Dal jsem si s ním spoustu práce a vypadá hodně slušně. Dá se použít i ve větších projektech.
 
A co že to tedy je? Jedná se o klikatelné menu, které se dynamicky vytváří pomocí textdrawů.

Tímto menu se dají v pohodě nahradit dialogy, nebo třeba původní GTA menu.

Začnu popisem, jak menu vypadá, jak funguje.
 
Vlastní přizpůsobení menu:
Menu se dá nastavit přesně podle vašich představ (samozřejmě v rámci možností samp).
Začnu vzhledem. Menu se dá nastavit barva pozadí, šířka a umístění na obrazovce (X, Y).
U titulku můžete samozřejmě nastavit text, styl písma a barvu textu.
Další, co už se vzhledu netýká, je, komu chcete menu zobrazit, jaké ID menu má mít (pro identifikaci menu jako v dialozích) a jestli má menu mít možnost být zavřené (zmáčknutí ESC).
Pokud zvolíte, že menu nesmí být zavíratelné (hráč musí zvolit nějakou položku aby mohl zavřít menu), bude se menu při zmáčknutí ESC znovu otvírat. V opačném případě se vyvolá callback funkce, ve které se dozvíte, že hráč zavřel menu, menu se skryje a pak je jen na vás, co s tím budete dělat, jestli ho zničíte, nebo znovu zobrazíte (což je zbytečné, pokud nastavíte menu, že jej nelze zavřít).
Při tvorbě musíte zadat i pozadí položky při najetí (u textdrawů zatím nelze vícebarevné označení aktivní položky). Což znamená, že každá položka bude po najetí myší označená stejně.
 
Každé položce se však dá nastavit jakákoliv barva pozadí, různý styl písma u každé položky a barva písma. Další věc co můžete nastavit položce, je, jestli bude klikatelná. Pokud zvolíte že ne, nepůjde na ni kliknout (hodí se například pro podnadpisy). Položkám se však nedá zpětně měnit žádné nastavení.
 
Callbacky:
V skriptu se nachází 2 callbacky, které musíte mít vložené v módu / skriptu. Pokud tak neučiníte, bude vám compiler hlásit, že jste je nezapsali, neuvedli - chcete-li (anglicky: function "XXX" is not implemented). Takže o jaké callbacky jde:

public OnPlayerClickPlayerMenu(playerid, menuid, listitem) { }
public OnPlayerClosePlayerMenu(playerid, menuid) { }

Nepotřebují returny, ale já defaultně používám v ukázce return 1;
 
 
Funkce pro vytváření menu:
Tak a už se dostáváme k samotným funkcím, které se budou používat pro vytváření menu, přidávání položek, zobrazování, skrývání, ničení nebo pro  kontrolu existence menu.
 
Varování! Pokud již máte pro hráče nějaké menu vytvořené a zavoláte znovu tuto funkci, vytvořené menu se zničí!
 
Menu vytvoříte jednoduše tímto příkazem:

playerMenuCreate(playerid, menuid, Float:menuX, Float:menuY, Float:menuWidth, titleText[], titleFont, titleColor, backgroundColor, buttonColorHover, bool:isExitable);

playerid         = ID hráče, pro kterého se menu má vytvořit
menuid           = nastavení ID menu, podle kterého pak budete určovat, v jakém menu uživatel kliknul, případně jaké menu zavřel
menuX, menuY     = určení pozice menu
menuWidth        = určení šířky menu
titleText        = text, který bude uvedený v titulku menu
titleFont        = styl písma (jako u textdrawů)
titleColor       = barva textu v titulku menu
backgroundColor  = barva pozadí celého menu
buttonColorHover = barva označení tlačítka po najetí na něj
isExitable       = true / false | určení, jestli menu půjde zavřít pomocí klávesy ESC

Takže máte inicializované menu.
Nyní je třeba přidat nějaké položky, na které pak budete moci klikat:

playerMenuAddItem(playerid, itemText[], itemFont, textColor, buttonColor, bool:isDisabled);

playerid    = ID hráče, kterému se položka do menu přidá
itemText    = text v položce
itemFont    = styl písma v položce
textColor   = barva textu v položce
buttonColor = barva pozadí položky
isDisabled  = určení, jestli položka nebude klikatelná, nebo ano

Maximální počet položek je limitován (v definici MAX_MENU_ITEMS) defaultně na 15 položek
 
Už máte sestavené menu.
Pro zjištění, jestli nějaké menu hráč má vytvořené (je jedno jestli zobrazené nebo skryté), je zde funkce:

playerMenuExists(playerid);

Vrací hodnotu true při existenci. V opačném případě vrátí false.

Menu nyní stačí zobrazit hráči:

playerMenuShow(playerid);

playerid = ID hráče, kterému se sestavené menu (pro něj) zobrazí

Pro skrytí menu slouží funkce:

playerMenuHide(playerid);

Pro zničení menu (pokud ho již nepotřebujete) je tato funkce:

playerMenuDestroy(playerid);

Kompletní ukázka použití se nachází níže u přiloženého includu. V includu se dále nachází definice MAX_PLAYERS_EX s výchozí hodnotou 250. Pokud ji chcete nastavit v módu / FS, před includováním si ji definujte sami. Ukázka:

#define MAX_PLAYERS_EX 100
#include menu_system

To samé s MAX_MENU_ITEMS.

 

Menu používá 2 + počet položek * 2  player textdrawů.
 
 
Obrázková ukázka menu:
 
Myší najeto na první položku
menu1.png
 
Myší najeto na 6. položku:
menu2.png
 
 
Includ (+ obyčejná ukázka):
Pastebin: http://pastebin.com/8Y7HgdGH
 
Kód:

 

#if defined menu_system
	#endinput
#endif
#define menu_system

#if !defined MAX_PLAYERS_EX
    #define MAX_PLAYERS_EX 250
#endif

#if !defined MAX_MENU_ITEMS
	#define MAX_MENU_ITEMS 15
#endif

//#################################| Natives |##################################
/*
native playerMenuCreate(playerid, menuid, Float:menuX, Float:menuY, Float:menuWidth, titleText[], titleFont, titleColor, backgroundColor, buttonColorHover, bool:isExitable);
native playerMenuAddItem(playerid, itemText[], itemFont, textColor, buttonColor, bool:isDisabled);
native playerMenuShow(playerid);
native playerMenuHide(playerid);
native playerMenuDestroy(playerid);
native bool:playerMenuExists(playerid);
*/


//#################################| Forwards |#################################
forward playerMenuCreate(playerid, menuid, Float:pm_x, Float:pm_y, Float:pm_width, titleText[], titleFont, titleColor, bgColor, buttonColorIn, bool:exitable);
forward playerMenuAddItem(playerid, itemText[], itemFont, textColor, buttonColor, bool:disabled);
forward playerMenuShow(playerid);
forward playerMenuHide(playerid);
forward playerMenuDestroy(playerid);
forward bool:playerMenuExists(playerid);

//Callbacks
forward OnPlayerClickPlayerMenu(playerid, menuid, listitem);
forward OnPlayerClosePlayerMenu(playerid, menuid);


//################################| Variables |#################################
enum PLAYER_MENU_DATA{
	bool:menuExitable,
	bool:menuCreated,
	Float:itemWidth,
	Float:itemPosX,
	Float:itemPosY,
	itemColorIn,
	itemsCount,
	menuID
}

new playerMenuData[MAX_PLAYERS_EX][PLAYER_MENU_DATA];
new PlayerText:playerMenuBackground[MAX_PLAYERS_EX];
new PlayerText:playerMenuItem[MAX_PLAYERS_EX][MAX_MENU_ITEMS * 2];
new PlayerText:playerMenuTitle[MAX_PLAYERS_EX];


//#################################| Publics |##################################
public playerMenuCreate(playerid, menuid, Float:pm_x, Float:pm_y, Float:pm_width, titleText[], titleFont, titleColor, bgColor, buttonColorIn, bool:exitable){
	if(playerMenuExists(playerid)){
		playerMenuDestroy(playerid);
	}

	//Background
	new Float:TXTD_posX = pm_x + pm_width;
	playerMenuBackground[playerid] = CreatePlayerTextDraw(playerid, TXTD_posX, pm_y, "_");
	PlayerTextDrawBackgroundColor(playerid, playerMenuBackground[playerid], 255);
	PlayerTextDrawFont(playerid, playerMenuBackground[playerid], 1);
	PlayerTextDrawLetterSize(playerid, playerMenuBackground[playerid], 1.0, 1.6);
	PlayerTextDrawColor(playerid, playerMenuBackground[playerid], -1);
	PlayerTextDrawSetOutline(playerid, playerMenuBackground[playerid], 0);
	PlayerTextDrawSetProportional(playerid, playerMenuBackground[playerid], 0);
	PlayerTextDrawSetShadow(playerid, playerMenuBackground[playerid], 1);
	PlayerTextDrawUseBox(playerid, playerMenuBackground[playerid], 1);
	PlayerTextDrawBoxColor(playerid, playerMenuBackground[playerid], bgColor);
	PlayerTextDrawTextSize(playerid, playerMenuBackground[playerid], pm_x, 1.0);
	PlayerTextDrawSetSelectable(playerid, playerMenuBackground[playerid], 0);

	//Title
	playerMenuTitle[playerid] = CreatePlayerTextDraw(playerid, pm_x + 4, pm_y + 2, titleText);
	PlayerTextDrawBackgroundColor(playerid, playerMenuTitle[playerid], 255);
	PlayerTextDrawFont(playerid, playerMenuTitle[playerid], titleFont);
	PlayerTextDrawLetterSize(playerid, playerMenuTitle[playerid], 0.44, 1.0);
	PlayerTextDrawColor(playerid, playerMenuTitle[playerid], titleColor);
	PlayerTextDrawSetOutline(playerid, playerMenuTitle[playerid], 0);
	PlayerTextDrawSetProportional(playerid, playerMenuTitle[playerid], 1);
	PlayerTextDrawSetShadow(playerid, playerMenuTitle[playerid], 1);
	PlayerTextDrawSetSelectable(playerid, playerMenuTitle[playerid], 0);

	//Settings for buttons
	playerMenuData[playerid][menuExitable]	= exitable;
	playerMenuData[playerid][menuCreated]	= true;
	playerMenuData[playerid][itemColorIn]	= buttonColorIn;
	playerMenuData[playerid][itemsCount]	= 0;
	playerMenuData[playerid][itemWidth]	= pm_width - 6;
	playerMenuData[playerid][itemPosX]	= pm_x + 3;
	playerMenuData[playerid][itemPosY]	= pm_y + 16;
	playerMenuData[playerid][menuID]	= menuid;
}

public playerMenuAddItem(playerid, itemText[], itemFont, textColor, buttonColor, bool:disabled){
	if(playerMenuExists(playerid)){
	    if(playerMenuData[playerid][itemsCount] + 1 < MAX_MENU_ITEMS){
	        new ID = playerMenuData[playerid][itemsCount] * 2;
	        PlayerTextDrawLetterSize(playerid, playerMenuBackground[playerid], 1.0, 1.7 + (++playerMenuData[playerid][itemsCount] * 1.885));

			//Menu item background
			playerMenuItem[playerid][ID] = CreatePlayerTextDraw(playerid, playerMenuData[playerid][itemPosX], playerMenuData[playerid][itemPosY] + ((playerMenuData[playerid][itemsCount] - 1) * 17), "LD_SPAC:white");
			PlayerTextDrawBackgroundColor(playerid, playerMenuItem[playerid][ID], 255);
			PlayerTextDrawFont(playerid, playerMenuItem[playerid][ID], 4);
			PlayerTextDrawLetterSize(playerid, playerMenuItem[playerid][ID], 1.0, 1.0);
			PlayerTextDrawColor(playerid, playerMenuItem[playerid][ID], buttonColor);
			PlayerTextDrawSetOutline(playerid, playerMenuItem[playerid][ID], 0);
			PlayerTextDrawSetProportional(playerid, playerMenuItem[playerid][ID], 1);
			PlayerTextDrawSetShadow(playerid, playerMenuItem[playerid][ID], 1);
			PlayerTextDrawUseBox(playerid, playerMenuItem[playerid][ID], 1);
			PlayerTextDrawBoxColor(playerid, playerMenuItem[playerid][ID], 255);
			PlayerTextDrawTextSize(playerid, playerMenuItem[playerid][ID], playerMenuData[playerid][itemWidth], 17.0);
			if(!disabled) PlayerTextDrawSetSelectable(playerid, playerMenuItem[playerid][ID], 1);
			else		  PlayerTextDrawSetSelectable(playerid, playerMenuItem[playerid][ID], 0);

			//Menu item text
			ID++;
			if(itemFont > 3) itemFont = 3;
			else if(itemFont < 0) itemFont = 0;
			playerMenuItem[playerid][ID] = CreatePlayerTextDraw(playerid, playerMenuData[playerid][itemPosX] + 3, playerMenuData[playerid][itemPosY] + ((playerMenuData[playerid][itemsCount] - 1) * 17) + 3, itemText);
			PlayerTextDrawBackgroundColor(playerid, playerMenuItem[playerid][ID], 255);
			PlayerTextDrawFont(playerid, playerMenuItem[playerid][ID], itemFont);
			PlayerTextDrawLetterSize(playerid, playerMenuItem[playerid][ID], 0.44, 1.0);
			PlayerTextDrawColor(playerid, playerMenuItem[playerid][ID], textColor);
			PlayerTextDrawSetOutline(playerid, playerMenuItem[playerid][ID], 0);
			PlayerTextDrawSetProportional(playerid, playerMenuItem[playerid][ID], 1);
			PlayerTextDrawSetShadow(playerid, playerMenuItem[playerid][ID], 1);
			PlayerTextDrawSetSelectable(playerid, playerMenuItem[playerid][ID], 0);
		}
	}
}

public playerMenuShow(playerid){
	if(playerMenuExists(playerid)){
		PlayerTextDrawShow(playerid, playerMenuBackground[playerid]);
		PlayerTextDrawShow(playerid, playerMenuTitle[playerid]);
		for(new i; i < playerMenuData[playerid][itemsCount] * 2; i++){
			PlayerTextDrawShow(playerid, playerMenuItem[playerid][i]);
		}
		SelectTextDraw(playerid, playerMenuData[playerid][itemColorIn]);
	}
}

public playerMenuHide(playerid){
	if(playerMenuExists(playerid)){
		PlayerTextDrawHide(playerid, playerMenuBackground[playerid]);
		PlayerTextDrawHide(playerid, playerMenuTitle[playerid]);
		for(new i; i < playerMenuData[playerid][itemsCount] * 2; i++){
			PlayerTextDrawHide(playerid, playerMenuItem[playerid][i]);
		}
		CancelSelectTextDraw(playerid);
	}
}

public playerMenuDestroy(playerid){
	if(playerMenuExists(playerid)){
	    PlayerTextDrawDestroy(playerid, playerMenuBackground[playerid]);
	    PlayerTextDrawDestroy(playerid, playerMenuTitle[playerid]);
	    for(new i; i < playerMenuData[playerid][itemsCount] * 2; i++){
			PlayerTextDrawDestroy(playerid, playerMenuItem[playerid][i]);
		}
        playerMenuData[playerid][menuCreated]	= false;
		playerMenuData[playerid][itemColorIn]	= 0;
		playerMenuData[playerid][itemsCount]	= 0;
		playerMenuData[playerid][itemWidth]	= 0;
		playerMenuData[playerid][itemPosX]	= 0;
		playerMenuData[playerid][itemPosY]	= 0;
		playerMenuData[playerid][menuID]	= 0;

	}
}

public bool:playerMenuExists(playerid){
	return playerMenuData[playerid][menuCreated];
}

public OnPlayerClickPlayerTextDraw(playerid, PlayerText:playertextid){
	if(playerMenuExists(playerid)){
		for(new i; i < playerMenuData[playerid][itemsCount]; i++){
			if(playertextid == playerMenuItem[playerid][i * 2]){
				OnPlayerClickPlayerMenu(playerid, playerMenuData[playerid][menuID], i);
				return 1;
			}
		}
	}
	return 0;
}

public OnPlayerClickTextDraw(playerid, Text:clickedid){
	if(playerMenuExists(playerid) && _:clickedid == 65535){
		if(!playerMenuData[playerid][menuExitable]) playerMenuShow(playerid);
		else{
		    playerMenuHide(playerid);
		    OnPlayerClosePlayerMenu(playerid, playerMenuData[playerid][menuID]);
		}
	}
	return 0;
}
//##################################| USAGE |###################################
/*

	## IMPORTANT

public OnPlayerConnect(playerid){
	playerMenuDestroy(playerid);
	return 1;
}

public OnPlayerDisconnect(playerid, reason){
	playerMenuDestroy(playerid);
	return 1;
}


	## CALLBACKS
	CATCHING RESPONSES

public OnPlayerClickPlayerMenu(playerid, menuid, listitem){
	if(menuid == 1){
		switch(listitem){
			case 0: return SendClientMessage(playerid, 0xff5555ff, "Klikl jsi na 1. polozku");
			case 1: return SendClientMessage(playerid, 0xff5555ff, "Klikl jsi na 2. polozku");
			case 2: return SendClientMessage(playerid, 0xff5555ff, "Klikl jsi na 3. polozku");
		}
	        playerMenuHide(playerid);
		playerMenuDestroy(playerid);
	}
	return 1;
}

public OnPlayerClosePlayerMenu(playerid, menuid){
	playerMenuHide(playerid);
	playerMenuDestroy(playerid);
	return 1;
}


	## CREATING MENU

public OnPlayerCommandText(playerid, cmdtext[]){
	if(!strcmp("/test", cmdtext, true)){
		playerMenuCreate(playerid, 1, 200, 200, 200, 0x595959aa, "Nadpis menu", 1, 0xffffffff, 0xabababff);
		playerMenuAddItem(playerid, "Nadpis v menu", 2, 0xccccccff, 0x232323ff, false);
		playerMenuAddItem(playerid, "Polozka 1", 2, 0xccccccff, 0x232323ff, false);
		playerMenuAddItem(playerid, "Polozka 2", 2, 0xccccccff, 0x232323ff, false);
		playerMenuShow(playerid);
		return 1;
	}
	return 0;
}

*/

 

 

 

Podrobnější ukázka (plně funkční) + má vlastní zjednodušující funkce na výpis formátovaných zpráv:
Pastebin: http://pastebin.com/e2pGd6cY
 
Kód:

 

#include a_samp
#include menu_system

stock FormattedSCM(playerid, color, str[], {Float,_}:...){
	new output[140], tmpOp[12], args = numargs(), args_readed = 2;
	if(args > 3){
		for(new i; str[i]!='\0'; i++){
		    if(str[i] == '%' && args_readed < args){
			    switch(str[++i]){
			        case 's':{
			            new tmpchr;
			            new a;
			            args_readed++;
						while(a==a){
						    tmpchr = getarg(args_readed,a++);
						    if(tmpchr=='\0') break;
							format(output, sizeof(output), "%s%c", output, tmpchr);
						}
					}
					case 'c','d','f','i','x':{
						format(tmpOp, sizeof(tmpOp),"%%s%%%c",str[i]);
						format(output, sizeof(output), tmpOp, output, getarg(++args_readed));
						strdel(tmpOp,0,strlen(tmpOp));
					}
					case '%': format(output,sizeof(output),"%s%%%%",output);
					default: format(output,sizeof(output),"%s%c",output,str[i]);
				}
			}
			else{
				format(output,sizeof(output),"%s%c",output,str[i]);
			}
		}
	}
	else{
	    strdel(output,0,sizeof(output));
	    strins(output,str,0);
	}
	if(playerid < 0) SendClientMessageToAll(color, output);
	else SendClientMessage(playerid, color, output);
}

public OnPlayerConnect(playerid){
	playerMenuDestroy(playerid);
	return 1;
}

public OnPlayerDisconnect(playerid, reason){
	playerMenuDestroy(playerid);
	return 1;
}

public OnPlayerClickPlayerMenu(playerid, menuid, listitem){
	FormattedSCM(-1, 0x33ff33ff, "Opened menu / Playerid: %d | MenuID: %d | ListItem: %d", playerid, menuid, listitem);
	playerMenuHide(playerid);
	playerMenuDestroy(playerid);
	return 1;
}

public OnPlayerClosePlayerMenu(playerid, menuid){
	FormattedSCM(-1, 0x33ff33ff, "Closed menu / Playerid: %d | MenuID: %d", playerid, menuid);
	playerMenuHide(playerid);
	playerMenuDestroy(playerid);
	return 1;
}

public OnPlayerCommandText(playerid, cmdtext[]){
	if(!strcmp("/create", cmdtext, true)){
		playerMenuCreate(playerid, random(1000), 20+random(130), 20+random(130), 160+random(100), "Testovaci menu", 1, 0xffffffff, 0x59595977, 0x898989ff, true);
		playerMenuAddItem(playerid, "Polozka 1", 1, 0x666666ff, 0x232323ff, false);
		playerMenuAddItem(playerid, "Polozka 2", 1, 0x777777ff, 0x232323ff, false);
		playerMenuAddItem(playerid, "Polozka 3", 1, 0x888888ff, 0x232323ff, false);
		playerMenuAddItem(playerid, "Polozka 4", 1, 0x999999ff, 0x232323ff, false);
		playerMenuAddItem(playerid, "Polozka 5", 1, 0xaaaaaaff, 0x232323ff, false);
		playerMenuAddItem(playerid, "Polozka 6", 1, 0xbbbbbbff, 0x232323ff, false);
		playerMenuAddItem(playerid, "Polozka 7", 1, 0xccccccff, 0x232323ff, false);
		playerMenuAddItem(playerid, "Polozka 8", 1, 0xddddddff, 0x232323ff, false);
		playerMenuAddItem(playerid, "Polozka 9", 1, 0xeeeeeeff, 0x232323ff, false);
		playerMenuShow(playerid);
		return 1;
	}
	return 0;
}

Vysvětlení funkce FormattedSCM:

FormattedSCM(playerid, barva, string, parametry...);
Použití:

FormattedSCM(playerid, 0xFFFFFFFF, "Ahoj já jsem %s věta a obsahuji navíc číslo %d.", "testovací", 6);

Pokud za playerid dáte -1, zpráva se pošle všem.

 

 

Nic jsem nekopíroval, vše je čistě má práce. Pokud se někdo diví, proč mám v includu použití popsané anglicky, je to proto, že jsem zvyklý psát kód v angličtině, tak jsem tam dopsal anglicky i použití, které jsem tu ostatně celkem podrobně popsal.
 
Doufám, že se vám skript hodí, protože mně už k ničemu není.

Link to comment
Share on other sites

NJ, tiež nechápem čo je na tom profi, ale rozhodne je to super, že si vytvoril takto upravovateľné funkcie resp procedúry.
Tu človek zriedka vidí niečo super :d.

Link to comment
Share on other sites

co je na tom "profi" ? :d

 

Děkuji za tvoji vyčerpávající otázku.

Mimochodem pokud sis přečetl titulek a pak prohlídl obrázky, na kterých jsem naházel položky v šedé barvě, je to opravdu málo k pochopení. ;)

 

Profi je myšlené spíš z pohledu obsluhy menu. Ale tak abyste neřekli, já to slovíčko vymažu, ať tu nemluvíte celou dobu jen o něm.

Link to comment
Share on other sites

Pekné až na tie proporcie textu..sú hrozne sploštené, vyzerá to neprirodzene :) A inak, sa mi to zdá alebo naozaj tie farby položiek idú postupne od šedej až po bielu?

Link to comment
Share on other sites

Pekné až na tie proporcie textu..sú hrozne sploštené, vyzerá to neprirodzene :) A inak, sa mi to zdá alebo naozaj tie farby položiek idú postupne od šedej až po bielu?

 

Tak proporce si každý už může v kódu doladit podle sebe a nebo změní styl písma, který na to asi taky bude mít vliv. A ano, ty barvy jsou ve stupních šedi. Když si rozevřeš „Podrobnější ukázka“ v prvním příspěvku (poslední spoiler), uvidíš jak jsem dal barvy. Moc jsem si nehrál s tím, aby to na screenech vypadalo nejlíp.

No a dají se využít třeba jako náhrada dialogů, nebo třeba klasického GTA menu.

Link to comment
Share on other sites

Epické ;) postni to i na samp forum,tam to bude mit větší ohlas

 

Jo no, tady si ty lamy nezaslouží nic. Neocení to, ale za rok to bude mít zas 80% CZ/SK serverů. :)

Link to comment
Share on other sites

Jo no, tady si ty lamy nezaslouží nic. Neocení to, ale za rok to bude mít zas 80% CZ/SK serverů. :)

 ____

radsej si uvedom ze toto ma uz teraz 80percent "uspesnych" zahranicnych serverov,... podla mna to ma byt samozrejmost kazdeho servera ktory chce nieco dosiahnut. cz/sk samp scena je strasne pozadu. A co mam ocenit? ved to ani nevyzera pekne.

 

btw 80% czsk serverov ma rze7.4

Link to comment
Share on other sites

AW.Tom, neoceníte kvalitu žádné práce. Podívej se někdy na SA-MP Forum.com. Ocení tam i to, když uděláš blbý příkaz na přidání peněz, hp, vesty, atd.

 

Toto je komunita na **** :)

 

 

Skvělá práce - 9/10 ! (Vždy jde něco vylepšit)

Link to comment
Share on other sites

AW.Tom, neoceníte kvalitu žádné práce. Podívej se někdy na SA-MP Forum.com. Ocení tam i to, když uděláš blbý příkaz na přidání peněz, hp, vesty, atd.

 

Toto je komunita na **** :)

 

 

Skvělá práce - 9/10 ! (Vždy jde něco vylepšit)

_________

 

lol a zato ze niekto oceni blbost tak ju mam ocenit aj ja? potom to tak dopada ked kazdy robi to co ostatni debili.

Link to comment
Share on other sites

 ____

radsej si uvedom ze toto ma uz teraz 80percent "uspesnych" zahranicnych serverov,... podla mna to ma byt samozrejmost kazdeho servera ktory chce nieco dosiahnut. cz/sk samp scena je strasne pozadu. A co mam ocenit? ved to ani nevyzera pekne.

 

btw 80% czsk serverov ma rze7.4

 

Ty jsi strašný odborník. Zasvěť mě. Ukaž mi 80% zahraničních serverů, které toto mají. CZ/SK nejsou zaostalí. Zaostalí jsou jen ti, co mají RZE a 15 FS (in 1) loaded. Jak říkám do roka to bude mít 80% CZ/SK serverů. Zbytek není zaostalej, chce něčeho dosáhnout a není samozřejmost, že toto má. Vůbec jsi nepochopil, k čemu jsem to sem dával. Je to crasher tvého mozku. :)

 

Omlovám se za pi**viny, které tu teď řeším, ale bohužel... Když tu začne někdo shazovat kvalitu nějaké práce a sám umí ho***, se kterým se navíc vychloubá (mám na mysli příšerné hry v C#, dobově tak z 1990), tak to nedokážu přehlížet. AW.Tom nejdřív zprovozni mozek, pak se ozývej.

 

Jo a hlavně začni, jak tu bývá zvykem, křičet, že jsem to okopčil z nějakých zahraničních serverů. To pak bude nejnádhernější konec. :)

 

Rohlikar:

Už mě moc nenapadlo co bych ještě přidal, takže jsem to nechal tak, navíc už Pawn ani nekódím. Každopádně díky.

Link to comment
Share on other sites

  • 1 month later...
  • 2 weeks later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...