Ez a script a mysql táblában megadott pozíciókon lévő be- illetve kijáratok közül megkeresi a hozzád legközelebb álló, veled egy virtualworldben és egy interiorban lévőt, majd annak párjára teleportál. Ez hasznos lehet pl. ahol dinamikus rendszerre van szükség eleve meglévő interioros, vagy saját mappolású helyekre, pl. benzinkút.
A táblából élőben keresi az ajtókat, így azok menet közben is szerkeszthetőek anélkül, hogy újra kéne indítani a szervert, igaz, ez egy normális scriptnél alapfeltétel kell, hogy legyen.
Próbáltam minél erőforrás kímélőbbre tervezni, nyugodtan szóljatok, ha láttok lehetőséget optimalizálásra.
Az eredetiben, amit feltettem, egyben volt a /enter és a /exit parancs.
Íme a javított változat:
PAWN forráskód:
YCMD:enter(playerid, params[], help) {
if(help) return Msg(playerid, X11_LIGHTBLUE, \"Ezzel a paranccsal tudsz bemenni valamennyi lehelyezett bejáraton.\");
mysql_tquery(sqlconn, \"SELECT * FROM entries\", \"SQL_entr_enter\", \"i\", playerid);
return 1;
}
function SQL_entr_enter(playerid) {
new Float:dist, pint = GetPlayerInterior(playerid), pvw = GetPlayerVirtualWorld(playerid), Float:nst = 2.5, nstid = -1, dint, dvw;
for(new i = 0; i < cache_num_rows(); i++) {
dint = cache_get_field_content_int(i, \"intout\");
if(dint != pint) continue;
dvw = cache_get_field_content_int(i, \"vwout\");
if(dvw != pvw) continue;
dist = GetPlayerDistanceFromPoint(playerid, cache_get_field_content_float(i, \"xout\"), cache_get_field_content_float(i, \"yout\"), cache_get_field_content_float(i, \"zout\"));
if(dist <= nst) {
nst = dist;
nstid = i;
}
}
if(nstid == -1) return Msg(playerid, X11_RED, \"Nincsen bejárat a közeledben!\");
SetPlayerInterior(playerid, cache_get_field_content_int(nstid, \"intin\"));
SetPlayerVirtualWorld(playerid, cache_get_field_content_int(nstid, \"vwin\"));
SetPlayerPos(playerid, cache_get_field_content_float(nstid, \"xin\"), cache_get_field_content_float(nstid, \"yin\"), cache_get_field_content_float(nstid, \"zin\"));
SetPlayerFacingAngle(playerid, cache_get_field_content_float(nstid, \"ain\"));
new capt[32];
cache_get_field_content(nstid, \"namein\", capt);
GameTextForPlayer(playerid, capt, 4500, 1);
return 1;
}
YCMD:exit(playerid, params[], help) {
if(help) return Msg(playerid, X11_LIGHTBLUE, \"Ezzel a paranccsal tudsz kimenni valamennyi lehelyezett kijáraton.\");
mysql_tquery(sqlconn, \"SELECT * FROM entries\", \"SQL_entr_exit\", \"i\", playerid);
return 1;
}
function SQL_entr_exit(playerid) {
new Float:dist, pint = GetPlayerInterior(playerid), pvw = GetPlayerVirtualWorld(playerid), Float:nst = 2.5, nstid = -1, dint, dvw;
for(new i = 0; i < cache_num_rows(); i++) {
dint = cache_get_field_content_int(i, \"intin\");
if(dint != pint) continue;
dvw = cache_get_field_content_int(i, \"vwin\");
if(dvw != pvw) continue;
dist = GetPlayerDistanceFromPoint(playerid, cache_get_field_content_float(i, \"xin\"), cache_get_field_content_float(i, \"yin\"), cache_get_field_content_float(i, \"zin\"));
if(dist <= nst) {
nst = dist;
nstid = i;
}
}
if(nstid == -1) return Msg(playerid, X11_RED, \"Nincsen kijárat a közeledben!\");
SetPlayerInterior(playerid, cache_get_field_content_int(nstid, \"intout\"));
SetPlayerVirtualWorld(playerid, cache_get_field_content_int(nstid, \"vwout\"));
SetPlayerPos(playerid, cache_get_field_content_float(nstid, \"xout\"), cache_get_field_content_float(nstid, \"yout\"), cache_get_field_content_float(nstid, \"zout\"));
SetPlayerFacingAngle(playerid, cache_get_field_content_float(nstid, \"aout\"));
new capt[32];
cache_get_field_content(nstid, \"nameout\", capt);
GameTextForPlayer(playerid, capt, 4500, 1);
return 1;
}
Az SQL tábla szerkezete:
CREATE TABLE IF NOT EXISTS `entries` (
`id` int(11) NOT NULL,
`namein` varchar(32) NOT NULL,
`intin` int(11) NOT NULL,
`vwin` int(11) NOT NULL,
`xin` float NOT NULL,
`yin` float NOT NULL,
`zin` float NOT NULL,
`ain` float NOT NULL,
`nameout` varchar(32) NOT NULL,
`intout` int(11) NOT NULL,
`vwout` int(11) NOT NULL,
`xout` float NOT NULL,
`yout` float NOT NULL,
`zout` float NOT NULL,
`aout` float NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
Egy példa, melynek segítségével akár egy IG bejárat hozzáadás parancsot is létre lehet hozni:
INSERT INTO entries (namein, intin, vwin, xin, xin, zin, ain, nameout, intout, vwout, xout, yout, zout, aout) VALUES
(\'Planning deptartment\', 3, 0, 384.809, 173.805, 1008.38, 0, \'San Fierro\', 0, 0, -2280.12, 829.479, 53.7535, 261.864);
Linkek:
.pwn:
[mediafire] [pastebin].sql:
[mediafire] [pastebin]A megadott példák alapján lehet tetszőlegesen 3dtext-eket letenni a bejáratokhoz, pickupokat, gombnyomásra aktiválást, szinte bármit.