Kwarde Geplaatst: 29 mei 2010 Rapport Geplaatst: 29 mei 2010 (bewerkt) Hoi! Dit is één van de beste car spawn systemen! Je kan als admin /vec [Voertuig ID] gebruiken, en je kan maar één auto! Als je voor de 2e keer een auto spawnt dan wordt de vorige VERWIJDERD, Dit is om spam tegen te staan (waardoor server gaat laggen) Ik zal uitleggen hoe je zoiets maakt, en aan het einde van de tutorial vind je een link met het hele systeem ZONDER commentaar! Laten we bovenaan de pagina beginnen Als eerst include je <a_samp> op deze manier: #include <a_samp> . Dit is voor alle basis dingen! Dan maak je de kleuren ROOD,GROEN en WIT aan, op deze manier: #define COLOR_WHITE 0xFFFFFFAA #define COLOR_RED 0xFF0000AA #define COLOR_GREEN 0x00FF00AA En nu de informatie waarin de volgende informatie wordt opgeslagen: - Heb je al een vehicle gespawned? - Wat is de gespawnde voertuig ID Die voegen we zo toe: enum pInfo() { pCarSpawned, pCarSpawnedID, }; new PlayerInfo[MAX_PLAYERS][pInfo]; de pCarSpawned is 'heb je al een vehicle gespawned?' de pCarSpawnedID is 'Wat is de gespawnde voertuig ID' Dus als het goed is heb je nu dit: #include <a_samp> #define COLOR_WHITE 0xFFFFFFAA #define COLOR_RED 0xFF0000AA #define COLOR_GREEN 0x00FF00AA enum pInfo() { pCarSpawned, pCarSpawnedID, }; new PlayerInfo[MAX_PLAYERS][pInfo]; OnPlayerConnect en OnPlayerDisconnect, hierin zet ik ook wat neer om bugs te voorkomen Dit keer geef ik het hele scriptje met commentaar public OnPlayerConnect(playerid) //Als de speler op de server komt... { PlayerInfo[playerid][pCarSpawned] = 0; //Je hebt geen voertuig gespawnd PlayerInfo[playerid][pCarSpawnedID] = (-1); //Invalide voertuig ID, dus GEEN voertuig gespawnd return 1; } public OnPlayerDisconnect(playerid) //Als de speler de server verlaat... { if(PlayerInfo[playerid][pCarSpawned] == 1) //Heb je een voertuig gespawnd? { DestroyVehicle(PlayerInfo[playerid][pCarSpawnedID]); //Vernietig de voertuig die is gespawned PlayerInfo[playerid][pCarSpawned] = 0; //Je hebt geen voertuig gespawned! PlayerInfo[playerid][pCarSpawnedID] = (-1); //Invalide voertuig ID, dus GEEN voertuig gespawnd return 1; } return 1; } En nu het commando zelf! Deze zal ik van stap tot stap uitleggen Als eerst open we het commando met: public OnPlayerCommandText(playerid, cmdtext[]) Dan maken we de volgende variables aan: cmd[128] - Voor de STRTOK tmp[128] - Ook voor de STRTOK string[265] - Om een bericht te weergeven met informatie idx - Voor STRTOK En dan gebruiken we: cmd = strtok(cmdtext, idx); Dan krijg je zoiets als dit: public OnPlayerCommandText(playerid, cmdtext[]) { new cmd[128], tmp[128], string[265], idx; cmd = strtok(cmdtext, idx); Open het commando op deze manier: if(!strcmp(cmd, "/vec", true)) Ik gebruik de 'veiligste' manier voor filterscripts, als je de 'normale' manier gebruikt kan je soms bugs krijgen, dat gewone commando's het niet meer goed doen door het filterscript! Nadat je het commando hebt aangemaakt kijken we of je wel iets hebt ingevuld achter /vec Dit doen we zo: tmp = strtok(cmdtext, idx); //Hetgene wat je acter /vec intypt if(!strlen(tmp)) //Als je NIKS hebt ingevuld { SendClientMessage(playerid, COLOR_WHITE, "GEBRUIK: /vec [Voertuig ID]"); //Stuur de gebruiker een bericht hoe het commando werkt return 1; //Stop de rest van het commando } Nu maken we een 'vecid' Op deze manier: new vecid = strval(tmp); De voertuig Id's in GTA SA zijn van 400 tot 611, dus we moeten een beveiliging maken, ervoor zorgen dat je niet lager of hoger doet! Dit doen we zo: if(vecid >= 400 && vecid <= 611) { En we kijken of de speler wel RCON admin is if(IsPlayerAdmin(playerid) == 1) { En zoals ik al zei: We voorkomen auto spam die de server kan laten laggen! Daarom kijken we of er een voertuig al is gespawnd, als dit is gebeurd wordt de vorige verwijderd! Dit doen we zo: if(PlayerInfo[playerid][pCarSpawned] == 1) //Zoals ik al zei: Heb je een voertuig gespawnd? { DestroyVehicle(PlayerInfo[playerid][pCarSpawnedID]); //En verwijder de auto PlayerInfo[playerid][pCarSpawned] = 0; //Je hebt geen voertuig gespawnd PlayerInfo[playerid][pCarSpawnedID] = (-1); //Invalide voertuig ID, dus GEEN voertuig gespawnd } Zo, de oude is verwijderd! Nu gaan we een nieuwe aanmaken new Float:pX, Float:pY, Float:pZ, Float: pA; //Voor de positie van de speler GetPlayerPos(playerid, pX, pY, pZ); //Waar is de speler? Hier wordt het voertuig namelijk neergezet! GetPlayerFacingAngle(playerid, pA); //Waar kijkt de speler naar. Hier kijkt het voertuig ook ONGEVEER naar (het is een beetje gebugd) PlayerInfo[playerid][pCarSpawned] = 1; //Je hebt een voertuig gespawnt PlayerInfo[playerid][pCarSpawnedID] = CreateVehicle(vecid, pX, pY, pZ, pA, -1, -1, 900); //Maak het voertuig aan op de plek van de speler PutPlayerInVehicle(playerid, PlayerInfo[playerid][pCarSpawnedID], 0); //Plaats de speler als bestuurder in het voertuig! format(string, sizeof string, "Je hebt een voertuig gespawnd, Model: %d, ID: %d", vecid, PlayerInfo[playerid][pCarSpawnedID]); //Maak een string aan met info SendClientMessage(playerid, COLOR_GREEN, string); //Laat de geformatteerde string aan de speler zien return 1; //idk... XD De auto is aangemaakt! Nu de 'ERROR' berichten maken Zet meteen onder hetgeen van zonet dit: } else //Als je GEEN administrator bent { SendClientMessage(playerid, COLOR_RED, "Je bent geen administrator!"); //Laat de speler het bericht zien dat hij niet een RCON admin is! } } else //Als hetgeen achter /vec lager dan 400 is of hoger dan 611 { SendClientMessage(playerid, COLOR_RED, "Voertuig Model moet boven 400 zijn en onder 611!"); //Laat de speler het bericht zien } return 1; } return 0; } Ziezo, nu alleen nog de STRTOK! Deze hoef je niet uit je hoofd te weten Zet gewoon ONDER aan het script dit; strtok(const string[], &index) { new length = strlen(string); while ((index < length) && (string[index] <= ' ')) { index++; } new offset = index; new result[20]; while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1))) { result[index - offset] = string[index]; index++; } result[index - offset] = EOS; return result; } En nu het resultaat, ik heb geen zin om een filmpje te maken dus ik typ het gewoon Ik kom ingame. Ik typ "/vec". De server zegt: "GEBRUIK: /vec [Vehicle ID]" Ik typ nu "/vec 522" (dat is een nrg-500). De server zegt: "Je bent geen administrator!" Nu log ik in als RCON. Ik typ nog eens "/vec 522". Ik krijg een NRG-500, waar ik meteen opzit en de server zegt: Je hebt een voertuig gespawnd, Model: 522, ID: 154" Nu typ ik "/vec 411". Mijn NRG-500 verdwijnt en ik zit opeens in een infernus! De server zegt weer hetzelfde als zonet, alleen is het Model: 411 in plaats van Model: 522 Dat was de tutorial! Zoals ik in het begin zei: aan het einde van de tutorial vind je een link voor het volledige script ZONDER commentaar Die is hier: http://pastebin.com/ityDUMN1 Veel plezier! Ik hoop dat je dit heeft geholpen! Mocht je nog problemen hebben hiermee, of een ander script, of als je ergens uitleg over wilt. Ik maak een tutorial voor je, in het forum of via PM! Groeten, Kwarde Bewerkt: 30 mei 2010 door Kwarde Reageren
Kwarde Geplaatst: 1 juni 2010 Auteur Rapport Geplaatst: 1 juni 2010 Sorry voor dubbelpost, ik kan niet bumpen (denk ik) Waarom wordt hier niet op gereageerd en op de rest wel... Gvm Reageren
Big Boss Geplaatst: 2 juni 2010 Rapport Geplaatst: 2 juni 2010 Ten eerste wil ik zeggen dat strtok oud is, en wordt afgekeurd door veel mensen omdat het te traag is etc. Maar dat terzijde Verder moet je nooit een lengte van 256 gebruiken voor strings (enkel als je MySQL of files werkt) omdat de maximale lengte van een chatbericht 128 cellen is. Verder leuke tutorial, en ik denk dat veel mensen iets zullen hebben aan de uitleg van de enum. Reageren
Kwarde Geplaatst: 2 juni 2010 Auteur Rapport Geplaatst: 2 juni 2010 Verder moet je nooit een lengte van 256 gebruiken voor strings (enkel als je MySQL of files werkt) omdat de maximale lengte van een chatbericht 128 cellen is. Bedankt voor de tip! Reageren
Recommended Posts
Een reactie plaatsen
Je kan nu een reactie plaatsen en pas achteraf registreren. Als je al lid bent, log eerst in om met je eigen account een reactie te plaatsen.