Szerző Téma: Bejárat rendszer  (Megtekintve 1764 alkalommal)

Nem elérhető KovaNovik

  • 1121
  • KovaNovik
    • Profil megtekintése
Bejárat rendszer
« Dátum: 2015. Január 09. - 21:43:16 »
+2 Show voters
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.
« Utoljára szerkesztve: 2015. Január 10. - 16:07:39 írta kzyn »

Bejárat rendszer
« Válasz #1 Dátum: 2015. Január 09. - 21:50:15 »
0 Show voters
Sql tábla?

Bejárat rendszer
« Válasz #2 Dátum: 2015. Január 10. - 09:29:44 »
0 Show voters
Idézetet írta: Chrispapa date=1420836615\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"52161\" data-ipsquote-contentclass=\"forums_Topic
Sql tábla?
 
ez az egyik..
a másik pedig.. oké.. bemész.. de ki hogy jössz? :D

Nem elérhető KovaNovik

  • 1121
  • KovaNovik
    • Profil megtekintése
Bejárat rendszer
« Válasz #3 Dátum: 2015. Január 10. - 15:57:43 »
0 Show voters
Idézetet írta: Chrispapa date=1420836615\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"52161\" data-ipsquote-contentclass=\"forums_Topic
Sql tábla?
 
Mellékeltem.
 

 

Sql tábla?
 
[/quote]
ez az egyik..
a másik pedig.. oké.. bemész.. de ki hogy jössz? :D
 
[/quote]
Eddig kintről be, és bentről ki is a /enterrel tudtál menni. Kérésedre javítottam ezt, így igaz, egy eljárással több, viszont több felesleges változóval kevesebb lett a kódom.

Bejárat rendszer
« Válasz #4 Dátum: 2015. Január 10. - 17:08:43 »
0 Show voters
Ebbe még csinálhatnál bejáratkészítést.

Nem elérhető Kovacs_Richard

  • 1743
  • HRP Fejlesztő
  • Discord: Kovacs_Richard#0321
    • Profil megtekintése
    • Hun Role Play Web
Bejárat rendszer
« Válasz #5 Dátum: 2015. Január 13. - 11:04:15 »
0 Show voters
ebben egy óriási kivetni valóm van...fogok felmegyek egy flooder programmal és nem csak a szervert, de a mysql-t is jól megterhelem...szerintem ahol SQL-be turkálsz legyen valami limit, vagy alap parancs használati limit, tehát mondjuk 1 parancs/mp-re lekorlátozni a használatot...de ez lehet csak szerintem probléma...ezen felül én inkább ramban tárolnám az adatot, ugyanúgy lehet módosítani futás közben...
Régóta nem tevékenykedem, mint SA-MP scripter.
HRP Fejlesztő.

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal