/*
SAMPFORUM » Szkript Liga vol. 3 » Régió I
Nem 100% precízen mentettem le a pozíciókat (Időtakarékosság miatt), és emiatt a 3D TextLabelek a szelvény-határtól picit árébb találhatóak, emiatt nincs a helyén, így zavaró lehet, hogy \"Állj!\"-t ír, miközben még el sem haladtunk ott.
Emellett a szelvények területei is néhol 1-2 koordinátányi hézagot magukba foglalnak, de a scriptben ez nem okoz gondot, azon az 1-2 másodpercen kívül, míg áthalad a vonat ott.
A ciklusokat lemértem, maximum 1ms-es időt vesznek igénybe.
Csak csatlakozz fel, és felül van 1 TD ami írja az infókat, azon kívül, hogy a labelek is írják, hogy a következendő szelvény folyamán mit kell tennünk.
Próbáltam a legjobb tudásom szerint megírni, köszönöm a lehetőséget.
/mycommand paranccsal az egyik vonathoz teleportálhatsz.
2016. 10. 01. 13:30 - Pedró
Jóslat: 3.5M Nem szavazat lesz, illetve 500K érvénytelen, illetve 300K Igen szavazat.
*/
#define FILTERSCRIPT
#include <a_samp>
#include <streamer>
#if !defined IsValidVehicle
native IsValidVehicle(vehicleid);
#endif
forward Labelek();
forward Allapotjelzo(playerid);
enum e_Szakaszok { Float:szakasz_minx, Float:szakasz_miny, Float:szakasz_maxx, Float:szakasz_maxy, szakasz_areaid, Float:szakasz_hatarx, Float:szakasz_hatary, Float:szakasz_hatarz, Text3D:szakasz_labelid }
enum e_Vonatok { vonat_modelid, Float:vonat_posx, Float:vonat_posy, Float:vonat_posz, Float:vonat_posa, vonat_vehicleid }
new Szakaszok[][e_Szakaszok] = {
// [ Szelvények területei ] [ Area ID ] [ Szelvények közötti határpontok ]
{ 1205.5, 2614.0, 2115.5, 2734.0, -2, 1266.872558, 2632.250000, 12.1256190 },
{ 2115.5, 2325.0, 2609.5, 2720.0, -2, 2121.173828, 2694.125000, 12.2504081 },
{ 2396.5, 1937.0, 2889.5, 2325.0, -2, 2553.451904, 2311.148925, 4.6881192 },
{ 2753.5, 1510.0, 2906.5, 1937.0, -2, 2781.000000, 1921.303588, 6.2574723 },
{ 2753.5, 913.0, 2885.5, 1510.0, -2, 2864.750000, 1461.005126, 12.125619 },
{ 2735.5, 197.0, 2871.5, 913.0, -2, 2764.750000, 907.654541, 12.2506195 },
{ 2727.5, -381.0, 2886.5, 197.0, -2, 2797.405273, 194.247161, 14.4350466 },
{ 2510.5, -396.0, 2727.5, -245.0, -2, 2721.997070, -283.049560, 18.0324787 },
{ 1942.5, -420.0, 2510.5, -245.0, -2, 2509.364257, -279.637695, 18.2335038 },
{ 1942.5, -668.0, 2207.5, -420.0, -2, 2002.869262, -434.857452, 70.9677209 },
{ 2093.5, -1123.0, 2405.5, -668.0, -2, 2165.864257, -680.980468, 51.60496510 },
{ 2219.5, -1558.0, 2359.5, -1123.0, -2, 2284.875000, -1165.943847, 27.78687011 },
{ 2169.5, -1964.0, 2256.5, -1558.0, -2, 2242.609619, -1563.812988, 20.30160712 },
{ 1686.5, -1973.0, 2169.5, -1887.0, -2, 2142.475585, -1953.750000, 15.12561913 },
{ 852.5, -1973.0, 1686.5, -878.0, -2, 1630.518798, -1953.666992, 14.87561914 },
{ 109.5, -1758.0, 852.5, -662.0, -2, 813.211547, -1365.021484, -0.21868815 },
{ -623.5, -1270.0, 108.5, -1000.0, -2, 50.017269, -1018.053161, 22.68371316 },
{ -975.5, -1541.0, -623.5, -1000.0, -2, -667.610473, -1123.282470, 50.38497117 },
{ -1319.5, -1574.0, -975.5, -1444.0, -2, -1009.199462, -1501.271484, 80.62905818 },
{ -2111.5, -1574.0, -1319.5, -1129.0, -2, -1329.708740, -1510.195434, 25.00061919 },
{ -2092.5, -1129.0, -1903.5, -589.0, -2, -1951.229614, -1116.607421, 17.92725520 },
{ -2075.5, -589.0, -1883.5, 221.0, -2, -1979.939819, -528.688476, 27.00061921 },
{ -2006.5, 221.0, -1633.5, 545.0, -2, -1919.774536, 275.882202, 20.58722622 },
{ -1633.5, 459.0, -747.5, 983.0, -2, -1615.132080, 501.720336, 27.79645323 },
{ -990.5, 983.0, -310.5, 1290.0, -2, -921.840942, 1005.392211, 35.87561724 },
{ -310.5, 1182.0, 782.5, 1322.0, -2, -286.222595, 1259.097412, 30.45894425 },
{ 571.5, 1322.0, 833.5, 2278.0, -2, 681.535583, 1336.197143, 13.12561926 },
{ 675.5, 2278.0, 835.5, 2600.0, -2, 726.049499, 2337.985351, 20.50285727 },
{ 669.5, 2600.0, 1205.5, 2797.0, -2, 817.386718, 2640.970947, 22.12561928 }
};
new Vonatok[][e_Vonatok] = {
{538, 1462.0745, 2630.8787, 10.8203, 200.0}, //LV
{538, -1942.7950, 168.4164, 27.0006, 200.0}, //SF
{538, 1700.7551, -1953.6531, 14.8756, 200.0} //LS
};
new PlayerText:td2;
new Timer1[MAX_PLAYERS] = {-1, ...};
new LabelekTimer;
public OnFilterScriptInit() {
for(new x; x < MAX_PLAYERS; x++) {
td2 = CreatePlayerTextDraw(x, 0, 0, \"HALADJON\");
}
if(!GetSVarInt(\"Vonatok\")) {
for(new x; x < sizeof(Vonatok); x++) {
switch(Vonatok
case 537, 538, 449: Vonatok
- [vonat_vehicleid] = AddStaticVehicle(Vonatok
- [vonat_modelid], Vonatok
- [vonat_posx], Vonatok
- [vonat_posy], Vonatok
- [vonat_posz], Vonatok
- [vonat_posa], -1, -1);
default: printf(\"Hiba, érvénytelen ModelID lett megadva a Vonatok tömbben. (%i. sor)\", x+1);
}
}
SetSVarInt(\"Vonatok\", 1);
}
if(!GetSVarInt(\"Szakaszok\")) {
for(new x; x < sizeof(Szakaszok); x++) {
Szakaszok
- [szakasz_areaid] = CreateDynamicRectangle(Szakaszok
- [szakasz_minx], Szakaszok
- [szakasz_miny], Szakaszok
- [szakasz_maxx], Szakaszok
- [szakasz_maxy], 0, 0, -1);
}
SetSVarInt(\"Szakaszok\", 1);
}
if(!GetSVarInt(\"Labelek\")) {
for(new x; x < sizeof(Szakaszok); x++) {
Szakaszok
- [szakasz_labelid] = CreateDynamic3DTextLabel(\"VASÚTI BERENDEZÉS:\\n{FF0000}!\", 0x00FF00FF, Szakaszok
- [szakasz_hatarx], Szakaszok
- [szakasz_hatary], Szakaszok
- [szakasz_hatarz], 100.0);
}
LabelekTimer = SetTimer(\"Labelek\", 2000, true);
SetSVarInt(\"Labelek\", 1);
}
return 1;
}
public OnFilterScriptExit() {
if(GetSVarInt(\"Vonatok\")) {
for(new x; x < sizeof(Vonatok); x++) DestroyVehicle(Vonatok
}
for(new x; x < MAX_PLAYERS; x++) {
PlayerTextDrawDestroy(x, td2);
if(Timer1
KillTimer(Timer1
Timer1
}
}
if(GetSVarInt(\"Szakaszok\")) {
for(new x; x < sizeof(Szakaszok); x++) {
DestroyDynamicArea(Szakaszok
Szakaszok
}
}
if(GetSVarInt(\"Labelek\")) {
for(new x; x < sizeof(Szakaszok); x++) {
DestroyDynamic3DTextLabel(Szakaszok
}
KillTimer(LabelekTimer);
LabelekTimer = -1;
}
DeleteSVar(\"Szakaszok\");
DeleteSVar(\"Labelek\");
DeleteSVar(\"Vonatok\");
return 1;
}
public OnPlayerConnect(playerid) {
td2 = CreatePlayerTextDraw(playerid, 0, 0, \"HALADJON\");
return 1;
}
public OnPlayerDisconnect(playerid, reason) {
PlayerTextDrawDestroy(playerid, td2);
if(Timer1[playerid] != -1) {
KillTimer(Timer1[playerid]);
Timer1[playerid] = -1;
}
return 1;
}
public OnPlayerCommandText(playerid, cmdtext[]) {
if (strcmp(\"/mycommand\", cmdtext, true, 10) == 0) {
SetPlayerPos(playerid, 1462.0745,2630.8787,13.8203);
return 1;
}
return 0;
}
public OnPlayerStateChange(playerid, newstate, oldstate) {
if(newstate == PLAYER_STATE_DRIVER && oldstate != PLAYER_STATE_DRIVER) {
for(new x; x < sizeof(Vonatok); x++) {
if(GetPlayerVehicleID(playerid) == Vonatok
Timer1[playerid] = SetTimerEx(\"Allapotjelzo\", 1000, true, \"i\", playerid);
}
}
}
if(newstate != PLAYER_STATE_DRIVER && oldstate == PLAYER_STATE_DRIVER) {
if(Timer1[playerid] != -1) {
KillTimer(Timer1[playerid]);
Timer1[playerid] = -1;
PlayerTextDrawHide(playerid, td2);
}
}
return 1;
}
public Labelek() {
new allapot, allapot2;
for(new x; x < sizeof(Szakaszok); x++) {
allapot = SzakaszAllapot(x);
allapot2 = SzakaszAllapot(KovetkezoSzakasz(x));
if(allapot) UpdateDynamic3DTextLabelText(Szakaszok
- [szakasz_labelid], 0x00FF00FF, \"VASÚTI BERENDEZÉS:\\n{FF0000}ÁLLJ!\");
else if(allapot2) UpdateDynamic3DTextLabelText(Szakaszok
- [szakasz_labelid], 0x00FF00FF, \"VASÚTI BERENDEZÉS:\\n{FFBB00}LASSÍTSON!\");
else if(allapot == 0) UpdateDynamic3DTextLabelText(Szakaszok
- [szakasz_labelid], 0x00FF00FF, \"VASÚTI BERENDEZÉS:\\n{00FF00}HALADJON!\");
}
return 1;
}
public Allapotjelzo(playerid) {
new szakaszid, string[120];
szakaszid = JelenlegiSzakasz(playerid);
new allapot1 = SzakaszAllapot(szakaszid);
new allapot2 = SzakaszAllapot(KovetkezoSzakasz(szakaszid));
if(allapot1 > 1) {
format(string, 120, \"~d~ SZELVENY: %i ~r~ALLJ! ~w~ ALLAPOT: %i KOVETKEZO ALLAPOT: %i\", szakaszid, allapot1, allapot2);
PlayerTextDrawSetString(playerid, td2, string);
}
else if(allapot2) {
format(string, 120, \"~>~ SZELVENY: %i ~p~LASSITSON! ~w~ ALLAPOT: %i KOVETKEZO ALLAPOT: %i\", szakaszid, allapot1, allapot2);
PlayerTextDrawSetString(playerid, td2, string);
}else{
format(string, 120, \"~u~ SZELVENY: %i ~g~HALADJON! ~w~ ALLAPOT: %i KOVETKEZO ALLAPOT: %i\", szakaszid, allapot1, allapot2);
PlayerTextDrawSetString(playerid, td2, string);
}
PlayerTextDrawShow(playerid, td2);
return 1;
}
stock SzakaszAllapot(szakaszid) {
if(szakaszid < 0 || szakaszid >= sizeof(Szakaszok)) return -1;
new Float: vpos[3], jarmuvek, vehicleid;
for(new x; x < sizeof(Vonatok); x++) {
vehicleid = Vonatok
if(!IsValidVehicle(vehicleid)) continue;
GetVehiclePos(vehicleid, vpos[0], vpos[1], vpos[2]);
if(IsPointInDynamicArea(Szakaszok[szakaszid][szakasz_areaid], vpos[0], vpos[1], vpos[2]))
jarmuvek++;
}
if(jarmuvek) return jarmuvek;
return 0;
}
stock JelenlegiSzakasz(playerid) {
if(!IsPlayerInAnyVehicle(playerid) || !IsPlayerInAnyDynamicArea(playerid, 1)) return -1;
new Float: vpos[3], vehicleid;
vehicleid = GetPlayerVehicleID(playerid);
GetVehiclePos(vehicleid, vpos[0], vpos[1], vpos[2]);
for(new x; x < sizeof(Szakaszok); x++)
if(IsPlayerInDynamicArea(playerid, Szakaszok
- [szakasz_areaid], 1)) return x;
return -2;
}
stock KovetkezoSzakasz(szakaszid) {
new kovetkezo = szakaszid+1;
if(kovetkezo == sizeof(Szakaszok)) kovetkezo = 0;
return kovetkezo;
}
[/quote]
Régió: I
Beküldő neve: Pedro
Beküldött script:
http://pastebin.com/dTfR0P1NÉrtékelés: 8/10
Megjegyzés: Tetszik a rövid és lényegretörő megvalósítás, viszont nem működik a rendszer jól, ha a pálya nem ér körbe (pl. egy LS-SF pályánál Flint County-n keresztül). Nagyon ötletes, ahogy megoldottad a szakaszállapot-jelzőt (a streamer-plugint használva), de összességében mint egy kész rendszer, Fl0rian megvalósítása jobb volt.