Felfedezhető területek, gangzone-k felhasználásával.
Copyright © 2014; Pedró;
Ez a filterscript szabad kód; terjeszthető illetve módosítható a
Free Software Foundation által kiadott GNU General Public License
dokumentumában leírtak; akár a licenc 2-es, akár (tetszőleges) későbbi
változata szerint.
Sziasztok!
Ezt a kódot már publikáltam, a Proline játékmódom publikálásakor, amely már eltűnt a fórumról, viszont szerintem kevesen fedezték fel benne ezt a frankó kis funkciót!
Természetesen én írtam a kódot, az ötlet a singleplayeres megoldásból merült.
Feltételek a kód futtatásához:
- Streamer plugin, illetve függvénykönyvtár alkalmazása
- 0.3+ szerver oldali kliens biztosítása
A kód:
#define FILTERSCRIPT
#include <a_samp>
#include <streamer>
#define pName(%1) PlayerName[%1]
forward CheckIntactZones();
enum E_IGZ { Float:gzPosX1, Float:gzPosY1, Float:gzPosX2, Float:gzPosY2, gzID, gzArea }
new IntactGangZones[100][E_IGZ], IntactZoneTimer;
new bool:IsIntactGZ[MAX_PLAYERS][100];
new PlayerName[MAX_PLAYERS][MAX_PLAYER_NAME];
public OnFilterScriptInit() {
new count = 0;
for(new i1; i1 < 10; i1++) {
for(new i2; i2 < 10; i2++) {
IntactGangZones[count][gzPosX1] = -3000.0 + (i1 * 600.0);
IntactGangZones[count][gzPosY1] = -3000.0 + (i2 * 600.0);
IntactGangZones[count][gzPosX2] = (IntactGangZones[count][gzPosX1] + 600.0);
IntactGangZones[count][gzPosY2] = (IntactGangZones[count][gzPosY1] + 600.0);
IntactGangZones[count][gzID] = GangZoneCreate(IntactGangZones[count][gzPosX1], IntactGangZones[count][gzPosY1], IntactGangZones[count][gzPosX2], IntactGangZones[count][gzPosY2]);
IntactGangZones[count][gzArea] = CreateDynamicRectangle(IntactGangZones[count][gzPosX1], IntactGangZones[count][gzPosY1], IntactGangZones[count][gzPosX2], IntactGangZones[count][gzPosY2], 0, 0);
count++;
}
}
IntactZoneTimer = SetTimer(\"CheckIntactZones\", 1000, true);
return 1;
}
public OnFilterScriptExit() {
KillTimer(IntactZoneTimer);
return 1;
}
public OnPlayerConnect(playerid) {
GetPlayerName(playerid, PlayerName[playerid], MAX_PLAYER_NAME);
for(new x; x < 100; x++) IsIntactGZ[playerid]
- = true; // Az összes terület felfedezetlen még.
return 1;
}
public OnPlayerDisconnect(playerid, reason) {
PlayerName[playerid][0] = EOS;
return 1;
}
public OnPlayerSpawn(playerid) {
SetPVarInt(playerid, \"Spawned\", 1);
for(new x; x < sizeof(IntactGangZones); x++) if(IsIntactGZ[playerid]
- ) GangZoneShowForPlayer(playerid, IntactGangZones
- [gzID], 0x8AE2FF65);
return 1;
}
public OnPlayerDeath(playerid, killerid, reason) {
SetPVarInt(playerid, \"Spawned\", 0);
return 1;
}
public CheckIntactZones() {
new string[144];
for(new playerid; playerid < GetMaxPlayers(); playerid++) {
if(GetPVarInt(playerid, \"Spawned\") && GetPlayerInterior(playerid) == 0 && GetPlayerVirtualWorld(playerid) == 0) {
if(IsPlayerInAnyDynamicArea(playerid)) {
for(new x; x < 100; x++) {
if(IsIntactGZ[playerid]
if(IsPlayerInDynamicArea(playerid, IntactGangZones
IsIntactGZ[playerid]
SetPlayerScore(playerid, GetPlayerScore(playerid) + 1);
GangZoneHideForPlayer(playerid, IntactGangZones
TogglePlayerDynamicArea(playerid, IntactGangZones
new count;
for(new y; y < 100; y++) if(IsIntactGZ[playerid][y] == false) count++;
format(string, sizeof(string), \"Egy ismeretlen rész felfedezve! {FFFF00}+1 {80FF80}Pont {FFFFFF}(%i/100)\", count);
SendClientMessage(playerid, 0x9C9C9CFF, string);
if(count == 50) {
format(string, sizeof(string), \"Felfedezte %s(%i) a fél San Andreas térképet. {FFFFFF}+50{FFFF00}Pont\", pName(playerid), playerid);
SendClientMessageToAll(0xFF88F9FF, string);
SetPlayerScore(playerid, GetPlayerScore(playerid) + 50);
}
if(count == 100) {
format(string, sizeof(string), \"Felfedezte %s(%i) az egész San Andreas térképet. {FFFFFF}+200{FFFF00}Pont\", pName(playerid), playerid);
SendClientMessageToAll(0xFF88F9FF, string);
SetPlayerScore(playerid, GetPlayerScore(playerid) + 200);
}
}
}
}
}
}
return 1;
}
A kód letölthető itt:
http://www.solidfiles.com/d/9f95200b58/zones.pwnVagy megtekinthető itt:
http://pastebin.com/v958TLn6
Mentést nem írtam bele, de itt van egy tippem, hogy kell menteni.
Elősször is mentsük stringbe az értékeket, amikor a játékos lelép a szerverről példuál, vagy timerrel...
new IGZ[256];
for(new x; x < 100; x++) strcat(IGZ, (IsIntactGZ[playerid]
- == true) ? (\" 1\") : (\" 0\"));
Mentsük el a(z) IGZ karakterláncot, vagy fájlba, vagy MySQL-be egy oszlopba.
Betöltéshez ötlet:
A karakterláncot beolvassuk az IGZ karakterlánc változóba..
Ha ez megvan, utána csak darabolni kell..
sscanf(IGZ, \"a<i>[100]\", IsIntactGZ[playerid]);
És kész is a betöltés, meg minden.
Csak figyeljetek oda arra, hogy az OnPlayerConnectnél én beírtam, hogy minden felfedezetlen legyen, ha használtok ilyen mentés-betöltést, akkor töröljétek azt.
[/quote]
Képek
A képek a 2014-es XMas szerveren készültek. /A szerver a képeken látott formában még nincs kész./
Használjátok egészséggel.
Kellemes ünnepeket kívánok mindenkinek! Pedró