Quote:
|
Originally Posted by MPKaboose
Quote:
|
Originally Posted by Silent.Hunter
Az OnGamemodeInit fügvényt töbször is meghívja másodpercenként... ezért másodpercenként töbször is megjelenítené a textdrawn-t. Ez lag-hoz és egyébb kellemetlenségekhez vezethet.
|
az nem igaz és a gamemodeinit alatt egy loop segítségével el készítheted egyszer minden játékosnak a textdrawot minthogy "végtelenül" újra készítsd a SecondLifeTXTTimer-t ahányszor azt hívod annyiszor újat készít
|
Így van az OnGameModeInit függvény csak egyszer hívódik meg, mikor a szerver elindul és nem ismétlődik folyamatosan. Ezt egyszerűen letudod ellenőrizni:
pawn Code:
public OnGameModeInit()
{
new
H,
M,
S;
gettime(H, M, S);
printf("Teszt szerver üzenet! Szerver Start, time: %02d:%02d:%02d", H, M, S);
return 1;
}
Megnézed mennyiszer jeleníti meg ezt az üzenetet mikor elindítod a szervert, persze megnézheted a server_log.txt fájlban is.
És a textdraw:
Ha dinamikusan változó textdraw-ot akarsz létrehozni akkor egy for vagy while ciklus segítségével létre kell hoznod minden játékosnak egy textdraw_ot, az OnGameModeInit függvény alatt. Utána az általad kreált public funkcióban, elég csak elrejteni majd megváltoztatni a textdraw szövegét és újra megjeleníteni. Felesleges leterhelni a szervert folyamatos textdraw létrehozással.
pawn Code:
#include <a_samp>
new
Text:sltxt[MAX_PLAYERS];
#define txtbox 0xC0C0C0AA
new
Float:txtx = 570.00,
Float:txty = 310.00;
public OnGameModeInit()
{
CreateTextDraw();
return true;
}
stock CreateTextDraw()
{
for(new i = 0, max_p = GetMaxPlayers(); i < max_p; i++) // Létrehozunk annyi textdrawot amennyi a max slotok száma.
// Azért kell elvileg annyi textdraw amennyi játékos van mivel mindegyiknek más tartalommal kell megjeleníteni.
{
sltxt[i] = TextDrawCreate(txtx, txty, " ");
TextDrawUseBox(sltxt[i], 1);
TextDrawFont(sltxt[i], 1);
TextDrawBoxColor(sltxt[i], txtbox);
}
return true;
}
forward SecondLifeTXTTimer(playerid, szoveg[], timer);
public SecondLifeTXTTimer(playerid, szoveg[], timer)
{
if(IsPlayerConnected(playerid))
{
TextDrawHideForPlayer(playerid, sltxt[playerid]); // Elrejtjük a textdrawot a playerid előtt
TextDrawSetString(sltxt[playerid], szoveg); // Megváltoztatjuk a textdraw szövegét.
TextDrawShowForPlayer(playerid, sltxt[playerid]); // Majd megjelenítjük újra a textdrawot a megváltoztatott tartalommal.
SetTimerEx("SecondLifeTXTHide", timer, false, "i", playerid); // Elindítunk egy nem ismétlődő timert ami arra hivatott hogy egy bizonyos idő után meghívjon egy olyan
// funkciót, ami elrejti a játékos előtt a textdrawot.
}
return true;
}
forward SecondLifeTXTHide(playerid);
public SecondLifeTXTHide(playerid) // Ide is azért kell public funkció mivel timer segítségével van meghívva.
{
if(IsPlayerConnected(playerid)) // Ezt feleslegesnek tartom de itt hagytam hátha a textdraw elrejtésének ideje túl hosszú és közben kilép a játékos.
{
TextDrawHideForPlayer(playerid, sltxt[playerid]); // Textdraw elrejtése
}
return true;
}
// Fura kiírások elkerülése végett a dinamikus textdrawot nem árt elrejteni játékos csatlakozáskor
public OnPlayerConnect(playerid)
{
TextDrawHideForPlayer(playerid, sltxt[playerid]);
return true;
}
Mondjuk nem így kellene működni, de ez a módszer vált be nálam kilométeróra textdraw esetén.