[Tutorial] Absolute beginner tutorials [SC]
#1

Ik zal in de serie [SC] (Simple Commands) een serie van simpele commando's plaatsen die je makkelijk kan leren en toepassen. Deze commando's zullen je een beetje inzicht geven in de verschillende functies die het SAMP-team je geeft in de a_samp.inc bijvoorbeeld.

1e commando: /kill

Om te starten met deze reeks tutorials zal ik eerst nader ingaan op de zogenaamde callback die gebruikt gaat worden. Een callback kan je zien als een grote functie waar je meerdere statements en functies in kwijt kan en die op een bepaald moment aangeroepen wordt.

De callback die we het meeste zullen gebruiken is:
pawn Код:
OnPlayerCommandText(playerid, cmdtext[])
Als we dus zeggen 'plaats het in de callback' dan wordt dus bovenstaande callback bedoeld tenzij anders aangegeven.

Het commando

Om een /kill commando te maken moet je eerst de theorie er achter weten. Wat gebeurd er als je jezelf vermoord (Niet proberen! Dit is niet in een spel en hier is het game over en no respawn!)? Je leven wordt beлindigd. Er is echter geen functie endLife(playerid) in samp (deze kunnen we wel maken, maar dit later misschien) dus moeten we het op een andere manier proberen. Na de functielijst te hebben bekeken op de sa-mp wiki (deze moet je echt even doorlezen) komen we het dichtste bij: SetPlayerHealth(playerid, Float:health).

Nu we weten dat we de staat van iemands leven kunnen instellen (hoeveel leven heeft die persoon nog over? Het rode balkje dus in je spel) weten we ook dat we dat helemaal naar 0 kunnen zetten. Op deze manier kunnen we zo een commando maken:

pawn Код:
if(!strcmp("/kill",cmdtext,true)) // STRing CoMPare controleert of parameter 1 en 2 identiek zijn en geeft een 0 terug als dit zo is
{
    SetPlayerHealth(playerid, 0.0); // zet de spelers leven op 0
    return 1; // geef aan dat het commando is gevonden
}
Dit commando plaatsen we onder de callback en dan kan je hem compileren (F5) en in je server laden en uittesten.

- Wijzigingen voorbehouden -
Reply
#2

Het is alweer tijd voor tutorial 2 in de SC reeks! Zoals je wellicht in de vorige tutorial hebt gelezen, wordt in deze reeks alleen gefocust op de commando's en niet op het compileren of het laden van een gamemode. Wellicht komt hier later nog een reeks tutorials over. Tot die tijd: blijf je script doorbouwen of zoek tot die tijd ergens anders even op hoe je dit doet.

2e commando: /healme

Hmm, ja.. nu hebben we onszelf vermoord in de vorige tutorial. Misschien is het dan ook handig om voor jezelf even een commando te maken waarmee je jezelf weer beter kan maken. Uit de dood opstaan is onmogelijk, maar als je van een gebouw (niet te hoog!) afspringt en je nog genoeg leven over hebt om niet dood te gaan, dan kan je dit commando inroepen.

Quote:

/healme verbetert je leven! Het is bewezen!

Het commando
Voordat ik hier op in zal gaan, raad ik je aan om de vorige tutorial te lezen als je dat nog niet hebt gedaan. Hier wordt namelijk ingegaan op de SetPlayerHealth()-functie die we hier ook weer gaan gebruiken.

Een commando wordt uiteraard weer standaard opgezet in de callback:
pawn Код:
if(!strcmp("/healme",cmdtext,true))
{
    // hier code
    return 1; // return TRUE kan volgens mij ook, maar dit zou ik moeten opzoeken.
}
Quote:
Originally Posted by Maikel
Ja, 'true' terug sturen kan ook omdat het gelijk staat aan 1. False staat dus gelijk aan 0.
Dank hiervoor


Het is zo dat je leven in een Float wordt weergegeven met een waarde tussen 0.0 (dood, zoals in de vorige tutorial) en 100.0 (vol leven). Bij auto's is dit 1000.0! Meer hierover in een latere tutorial.

Om het leven dus vol te zetten zodat je weer met volle moed verder kan, zetten we het leven op 100.0 met onze SetPlayerHealth-functie zoals dit:
pawn Код:
SetPlayerHealth(playerid,100.0);
Op het einde ziet ons commando er als volgt uit:
pawn Код:
if(!strcmp("/healme",cmdtext,true))
{
    SetPlayerHealth(playerid, 100.0);
    SendClientMessage(playerid, 0xFF0000AA, "We gaan er weer met frisse moed tegenaan!");
    return 1;
}
Goed he? Dat was dan het einde van deze tuto...... HE WACHT EENS EVEN! Wat is die nieuwe functie?! SendClientMessage? Wat is dat?!

Goed opgemerkt! Er is een nieuwe functie tussengevoegd. Deze functie geeft tekst weer op het scherm, in het chatvenster. De parameters van deze functie zijn als volgt:
pawn Код:
SendClientMessage(spelerID, kleur van de tekst, de tekst);
Quote:

Nu is dit heel mooi, maar ik kan die kleur niet eens uitspreken!

Deze tekst (0xFF0000AA) is een code gepresenteerd in HEX (dat is kort voor hexadecimaal, een bepaald telstelsel, ook wel bekend als het 16-tallig stelsel. Dit talstelsel wordt voornamelijk .... OK, ik hou al op). De kleurcodes kan je op internet opzoeken en, als je al eens in HTML hebt gewerkt (of css), dan ken je deze notatie al redelijk. De kleur die hier is gebruikt is:
#FF0000 (als gebruikt in HTML/CSS)
De werkwijze is als volgt om hier een kleur van te maken voor de chat:
1. Haal het hashteken voor de code weg (resultaat: FF0000)
2. Voeg aan de voorkant '0x' toe, om aan te tonen dat het om een hexadecimaal getal gaat. (resultaat: 0xFF0000)
3. Voeg aan de achterkant de helderheid, of doorzichtigheid hoe je het maar wil noemen -werkt nouwelijks in de chat naar mijn mening- toe. (resultaat: 0xFF0000AA).

AA is hier de best mogelijke of zo, geen idee. Zo heb ik het aangeleerd gekregen. Voor meer informatie over de notatie kun je terecht op css3.info waar de RGBA best wel goed (en niet te lang) staat uitgelegd.

Nu hebben we de kleurcode dus helemaal klaar en schrijven we alles in het commando.

Nu hou ik wel op, het is al een lange tutorial geworden. Je weet nu, als het goed is, hoe de SetPlayerHealth-functie werkt en bent iets bekender met SendClientMessage. Alles wat je nu nog rest is compileren en testen!

-Wijzigingen voorbehouden-
Reply
#3

We zijn alweer toe aan tutorial 3 in de Simple Commands reeks! In deze tutorial gaan we kennis maken met voertuigen.

3e commando: /healmycar
Nu we basiskennis hebben van het veranderen van het leven van een persoon kunnen we deze kennis ook bij auto's toepassen.

Het commando
Bij auto's (eigenlijk alle voertuigen) is het eigenlijk hetzelfde als bij personen. Alleen dan 10x erger. Maak je maar geen zorgen, met erger bedoel ik niet het script gedeelte - dat is maar 2x erger - maar het leven dat je hebt. Als persoon kan je maximaal 100.0 leven hebben, als voertuig heb je 1000.0 leven. Rond de 300.0 komt er rook uit volgens mij, maar dat is een beetje irrelevant.

De functies die we vandaag gaan behandelen zijn: Allereerst het commando die we vroeger (SAMP v0.2.x) gebruikten om het voertuig weer heel te maken:
pawn Код:
if(!strcmp("/healmycar",cmdtext,true))
{
    new vehicleID = GetPlayerVehicleID(playerid); // haal het voertuig ID op
    SetVehicleHealth(vehicleID,1000.0); // set het leven van het voertuig op 1000 (dus vol)
    SendClientMessage(playerid, 0xFF0000AA, "Je voertuig is gemaakt!"); // stuur een bericht naar de speler
    return 1; // geef aan dat het commando is gevonden
}
Het voertuig was gerepareerd en je kon er weer flink mee beuken op muren en zo. Hij zag er echter niet netjes uit. Hij leek nog steeds helemaal beschadigd (voor jou, voor anderen was er nooit schade te zien.. zo ver was de sync nog niet).

In SA:MP 0.3 is er een extra functie bij gekomen:
pawn Код:
RepairVehicle(vehicleid)
Deze functie zet de VehicleHealth, zoals we dat dan mooi noemen, op 1000.0 maar repareert ook de visuele schade. Je voertuig is dan weer helemaal heel! We kunnen deze functie als volgt gebruiken:
pawn Код:
if(!strcmp("/healmycar",cmdtext,true))
{
    new vehicleID = GetPlayerVehicleID(playerid); // haal het voertuig ID op
    RepairVehicle(vehicleID); // repareer het voertuig
    SendClientMessage(playerid, 0xFF0000AA, "Je voertuig is gerepareerd! Moet je eens zien hoe mooi!"); // stuur een bericht naar de speler
    return 1; // het commando is gevonden
}
Om toch even te zeuren over het gebruik van een variabele in deze code:
Gebruik geen onnodige variabelen. De twee lijnen die hierboven zijn beschreven (GetPlayerVehicleID & RepairVehicle) kunnen makkelijk in 1 regel en dan is er geen extra geheugen nodig. Door dit te doen komt het commando op het volgende uit:
pawn Код:
if(!strcmp("/healmycar",cmdtext,true))
{
    RepairVehicle(GetPlayerVehicleID(playerid)); // repareer het voertuig waar de speler in zit
    SendClientMessage(playerid, 0xFF0000AA, "Je voertuig is gerepareerd! moet je eens zien hoe mooi!"); // stuur een bericht naar de speler
    return 1; // het commando is gevonden
}
Op die manier sla je geen variabele op (vehicleID) en spaar je geheugen, wat je nodig zult hebben bij een grote gamemode.

Level up!
Je zult je wel afvragen wat hier nu weer komt. We spelen immers geen MMO of een ander spel (ja, SA:MP, maar nu even niet, je zit nu op het forum). We gaan onder dit kopje een klein beetje geavanceerdere dingen uitproberen. Als je dus al wat programmeerkennis hebt (bijvoorbeeld in PHP, ASP, C++, C, etc), of je wilt dit alvast proberen - maak je maar geen zorgen, het is allemaal makkelijke taal -, dan kan je hier wat extra lezen wat je zeker kunt (en later ook zult moeten) gebruiken om je commando's net dat beetje extra te geven dat ze nodig hebben.

Het eerste wat we gaan toevoegen aan onze commando's zijn if-statements (Als je nog niet weet wat het zijn dan kan je tot nu nog even op de wiki-pagina terecht. Later zal iemand hier ongetwijfeld een tutorial voor maken in het nederlands zodat het makkelijk te begrijpen is voor SA:MP-scripters).

Je hebt je eerste IF-statement al gebruikt bij het controleren op je commando:
pawn Код:
if(!strcmp("/healmycar",cmdtext,true))
We maken nu een extra if-statement in onze code om te controleren of de persoon wel in een voertuig zit! Als de speler te voet is, zit die niet in een voertuig en kan hij die ook niet maken. Om erachter te komen of de speler in een voertuig zit kunnen we de functie IsPlayerInAnyVehicle gebruiken. Deze functie geeft een 1 (true) terug als de speler in een voertuig zit en 0 (false) als die te voet is. Dat betekent dat we een IF-statement kunnen maken als volgt:
pawn Код:
if(IsPlayerInAnyVehicle(playerid) == 1) { <code> }
Omdat "== 1" gelijk staat aan het helemaal niet gebruiken (als de statement waar is, dan voert hij hem uit) kunnen we die weglaten zodat de code duidelijker wordt:
pawn Код:
if(IsPlayerInAnyVehicle(playerid)) { }
Om te controleren of de speler niet in een voertuig is gebruik je een ELSE-statement. Dit betekent: als het IF-statement niet waar is, ga dan hierin. Dus:
pawn Код:
if(IsPlayerInAnyVehicle(playerid)) { // code als conditie waar is
} else { // code als conditie niet waar is
}
Dit kunnen we ook sneller krijgen als je geen ELSE wilt, of als het overzichtelijker wordt op een andere manier te coderen:
pawn Код:
if(!IsPlayerInAnyVehicle(playerid)) { // deze code wordt uitgevoerd als de speler NIET in een voertuig is }
Onze functie wordt nu als volgt:
pawn Код:
if(!strcmp("/healmycar",cmdtext,true))
{
    if(!IsPlayerInAnyVehicle(playerid))
    {
        SendClientMessage(playerid, 0xFF0000AA, "Je zit niet in een voertuig!");
    } else {
        RepairVehicle(GetPlayerVehicleID(playerid));
        SendClientMessage(playerid, 0xFF0000AA, "Je voertuig is gerepareerd! Moet je eens zien hoe mooi!");
    }
    return 1;
}
Deze code kan nog compacter, maar hier komen we in een volgende tutorial nog wel op terug.

-Wijzigingen voorbehouden-
Reply
#4

"Let's communicate" is het thema van deze post, de 4e tutorial in de serie. In deze tutorial staat de interactie met meerdere gebruikers centraal.

4e commando: /healall
In deze tutorial gaan we de commando's die we geleerd hebben in de vorige tutorials combineren tot ййn geheel. We gaan werken met if-statements om te controleren of de persoon in een voertuig zit en ook gaan we een stap hoger zetten naar lussen ('loops' in het Engels).

Het commando
In dit commando repareren we alles: het leven van de persoon en, als ze in een voertuig zitten, het voertuig.
De meeste functies die we gaan gebruiken zijn al bekend. Hetgene wat er in deze tutorial bij komt is: IsPlayerConnected en lussen (voor nu is het de meest gebruikte lus: de for-lus).

Allereerst de theorie over lussen. Een lus is een stuk code wat zich steeds herhaald zolang een bepaalde conditie (dit kan je teruglezen bij: "Level up!" in de vorige tutorial) waar is. Een for-lus is als volgt opgebouwd:
Код:
for(
counter initialisatie;
conditie;
actie die uitgevoerd wordt nadat de lus is doorlopen (bijvoorbeeld de counter ophogen)
) { }
Een voorbeeld zoals deze lus gebruikt kan worden (je hoeft het nog niet te begrijpen):
pawn Код:
for(new id=0; id<MAX_PLAYERS;id++)
{
    SendClientMessage(id,COLOR_RED,"Hey player!");
}
In bovenstaande code wordt een counter aangemaakt ( id ). In de conditie wordt gecontroleerd of 'id' lager is dan MAX_PLAYERS (wat de waarde 500 heeft). Zolang dat waar is, dan wordt de code uitgevoerd binnen de haken (het sturen van een bericht naar de speler met playerid 'id'). Nadat de code is uitgevoerd wordt 'id' opgehoogd met 1.

Dezelfde code gaan wij ook implementeren in ons commando. Allereerst bouwen we het commando op:
pawn Код:
if(!strcmp("/healall",cmdtext,true))
{
    // code
    return 1;
}
Nu gaan we de for-lus implementeren in ons commando:
pawn Код:
if(!strcmp("/healall",cmdtext,true))
{
    for(new id=0;id<MAX_PLAYERS;id++)
    {
        // code voor iedere speler
    }
    return 1;
}
Nu eerst iets over de MAX_PLAYERS, die komt steeds terug en je vraagt je misschien af wat het is. MAX_PLAYERS is een zogenoemde 'constante' het is een variabele waarvan de waarde niet verandert. MAX_PLAYERS bevat het maximum aantal spelers dat je in je server kan hebben (dit is gedefinieerd door SA:MP, je kan hem zelf weer opnieuw definieren zodat je code efficienter wordt, maar dat is nu nog te hoog gegrepen).

De lus loopt dus door iedere speler die aanwezig kan zijn in de server. Nu kan je natuurlijk niet van iemand het leven veranderen die niet aanwezig is in je server! Daarvoor is de eerstgenoemde functie zeer makkelijk: IsPlayerConnected(). Deze functie controleert of de speler aanwezig is in de server (dan geeft hij 1 (true) terug en anders 0 (false)).

Nu is dit allemaal heel leuk, maar hoe gaan we dat implementeren in onze code? Hoe zorgen we ervoor dat de lus die speler (die er niet is) overslaat? Een lus komt met een aantal functies die gebruikt worden om de lus te beпnvloeden:
  • exit; // deze functie zorgt ervoor dat de lus helemaal wordt afgebroken: er wordt verder gegaan na de lus
  • continue; // deze functie zorgt ervoor dat het huidige item wordt overgeslagen. De derde parameter wordt aangeroepen (het ophogen van de counter) en de lus start opnieuw.
Deze functies gaan we dan ook leuk gebruiken, althans, ййn ervan: continue;.

pawn Код:
if(!strcmp("/healall",cmdtext,true))
{
    for(new id=0; id<MAX_PLAYERS; id++)
    {
        if(!IsPlayerConnected(id)) // als de speler niet is verbonden, dan skip deze ronde
        {
            continue;
        } else { // speler is wel verbonden voer het volgende uit
            if(IsPlayerInAnyVehicle(id)) // is de speler in een voertuig?
            {
                RepairVehicle(GetPlayerVehicleID(id)); // Repareer het voertuig
                SendClientMessage(id, 0xFF0000AA, "Oehh, nice and shiny!"); // stuur een bericht naar de speler
            }
            // deze code wordt aangeroepen ook al is de IF(IsPlayerInAnyVehicle) niet waar. dit is immers geen ELSE
            SetPlayerHealth(id,100.0); // zet de spelers leven op 100
            SendClientMessage(id,0xFF0000AA,"We gaan er weer met frisse moed tegenaan!"); // stuur een bericht naar de speler
        }
    }
    return 1; // het commando is gevonden
}
Zo hebben we een nieuw commando gemaakt waar we alles weer heel hebben gemaakt. Iedere speler die in je server aanwezig is kan er weer met frisse moed tegen aan.

Quote:
Originally Posted by Hiddos
Посмотреть сообщение
Ho ho! Je heb niet uitgelegd wat variabelen zijn! (Gewoon een klein stukje over opslag kan genoeg zijn, een basis om later uit te breiden.)
Oei! Excuus! :O Er is inderdaad iets gezegd over een 'constante', maar over de echte 'variabele' is nog niets gezegd.
Ieder dingetje wat je maakt wordt ergens opgeslagen in het geheugen. Je kunt bij deze dingen komen door het geheugenadres te specificeren. Je weet echter niet op welk adres het is opgeslagen in PAWN (niet op deze manier in ieder geval) in tegenstelling tot een lagere programmeertaal zoals Assembly. Om dingen wat makkelijker voor je te maken om ze terug te vinden (bijvoorbeeld een bepaalde auto die je hebt aangemaakt) worden variabelen gebruikt. Een variabele maak je aan door 'new' te gebruiken. Bijvoorbeeld:
pawn Код:
new myCar = AddStaticVehicle(/* hier je parameters */);
myCar is nu een variabele en kan ergens anders in je code weer gebruikt worden, mits je hem globaal hebt gedefinieerd. Hier ga ik nu niet op in, maar misschien in een volgende tutorial. Voor nu is het belangrijk dat je weet wat een variabele doet, niet wat voor types er zijn (er zijn 2 types: globaal en lokaal definieerde variabelen.. maar shht, dit heb ik nog niet verteld).


Suggesties voor tutorials? Vragen hierover? Stuur me een PM!

-Wijzigingen voorbehouden-
Reply
#5

Ho ho! Je heb niet uitgelegd wat variabelen zijn! (Gewoon een klein stukje over opslag kan genoeg zijn, een basis om later uit te breiden.)
Reply
#6

Ik zal verder gaan omdat ik me verveel.

5e commando: AFK / BACK
Een /AFK en /BACK commando, hierbij zal de speler onzichtbaar worden en in een freeze stand worden gezet todat hij /back typt.

pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
    if (strcmp("/afk", cmdtext, true, 4) == 0)
    {
        new name[MAX_PLAYER_NAME];
        new string[128];
        GetPlayerName(playerid, name, 24);
        format(string, sizeof(string), "%s is now Away From Keyboard (AFK)", name);
        SendClientMessageToAll(0xFFFF00AA, string);
        ApplyAnimation(playerid,"DANCING","DNCE_M_B",4.0,1,0,0,0,-1);
        SendClientMessage(playerid, 0xFF0000AA, "You are now Away From Keyboard. If you are back type /back.");
        SetPlayerVirtualWorld(playerid, 10);
        TogglePlayerControllable(playerid, 0);
        return 1;
    }
    if (strcmp("/back", cmdtext, true, 5) == 0)
    {
        new name[MAX_PLAYER_NAME];
        new string[128];
        GetPlayerName(playerid, name, 24);
        format(string, sizeof(string), "%s is now Back!", name);
        SendClientMessageToAll(0xFFFF00AA, string);
        ClearAnimations(playerid, 0);
        SendClientMessage(playerid, 0xFFFF00AA, "You are now Back!.");
        SetPlayerVirtualWorld(playerid, 0);
        TogglePlayerControllable(playerid, 1);
        return 1;
    }
Reply
#7

6e commando: /Rules

Dit is niet echt een commando dat iets met de speler doet die het commando heeft getypt, maar zend een tekst naar de speler.

pawn Код:
if (strcmp("/rules", cmdtext, true, 10) == 0)
    {
        SendClientMessage(0xDEEE20FF, "Een kogel door iemands kop jagen is verboden blablabla....");
    }
Deze code: 0xDEEE20FF is de kleur, deze kan je veranderen in andere kleuren.
Hier al een paar:

pawn Код:
#define COLOR_GRAD1 0xB4B5B7FF
#define COLOR_GRAD2 0xBFC0C2FF
#define COLOR_GRAD3 0xCBCCCEFF
#define COLOR_GRAD4 0xD8D8D8FF
#define COLOR_GRAD5 0xE3E3E3FF
#define COLOR_GRAD6 0xF0F0F0FF
#define COLOR_GREY 0xAFAFAFAA
#define COLOR_GREEN 0x33AA33AA
#define COLOR_RED 0xAA3333AA
#define COLOR_YELLOW 0xFFFF00AA
#define COLOR_WHITE 0xFFFFFFAA
#define COLOR_FADE1 0xE6E6E6E6
#define COLOR_FADE2 0xC8C8C8C8
#define COLOR_FADE3 0xAAAAAAAA
#define COLOR_FADE4 0x8C8C8C8C
#define COLOR_FADE5 0x6E6E6E6E
#define COLOR_PURPLE 0xC2A2DAAA
#define COLOR_DARKBLUE 0x2641FEAA
#define COLOR_ALLDEPT 0xFF8282AA
Reply
#8

Dit is ook nog handig voor in je gamemode:
pawn Код:
public OnPlayerDeath(playerid, killerid, reason)
{
    SendDeathMessage(killerid, playerid, reason);

    new deathreason[32];
    if(reason == 0) {format(deathreason, sizeof(deathreason), "Fists");}
        if(reason == 1) {format(deathreason, sizeof(deathreason), "Brass Knuckles");}
        if(reason == 2) {format(deathreason, sizeof(deathreason), "Golf Stick");}
        if(reason == 3) {format(deathreason, sizeof(deathreason), "Cop Stick");}
        if(reason == 4) {format(deathreason, sizeof(deathreason), "Knife");}
        if(reason == 5) {format(deathreason, sizeof(deathreason), "Baseball Bat");}
        if(reason == 6) {format(deathreason, sizeof(deathreason), "Shovel");}
        if(reason == 7) {format(deathreason, sizeof(deathreason), "Pool Cue");}
        if(reason == 8) {format(deathreason, sizeof(deathreason), "Katana");}
        if(reason == 9) {format(deathreason, sizeof(deathreason), "Chainsaw");}
        if(reason == 10){format(deathreason, sizeof(deathreason), "Dildo");}
        if(reason == 11){format(deathreason, sizeof(deathreason), "Small Vibrator");}
        if(reason == 12){format(deathreason, sizeof(deathreason), "Large Vibrator");}
        if(reason == 13){format(deathreason, sizeof(deathreason), "Vibrator");}
        if(reason == 14){format(deathreason, sizeof(deathreason), "Flowers");}
        if(reason == 15){format(deathreason, sizeof(deathreason), "Cane");}
        if(reason == 16){format(deathreason, sizeof(deathreason), "Grenade");}
        if(reason == 17){format(deathreason, sizeof(deathreason), "Smoke Grenade");}
        if(reason == 18){format(deathreason, sizeof(deathreason), "Molotov Cocktail");}
        if(reason == 19){format(deathreason, sizeof(deathreason), "Vehicle Weapon");}
        if(reason == 20){format(deathreason, sizeof(deathreason), "Hydra Flare");}
        if(reason == 21){format(deathreason, sizeof(deathreason), "Jetpack");}
        if(reason == 22){format(deathreason, sizeof(deathreason), "9mm");}
        if(reason == 23){format(deathreason, sizeof(deathreason), "Silenced 9mm");}
        if(reason == 24){format(deathreason, sizeof(deathreason), "Desert Eagle");}
        if(reason == 25){format(deathreason, sizeof(deathreason), "Shotgun");}
        if(reason == 26){format(deathreason, sizeof(deathreason), "Sawnoff Shotgun");}
        if(reason == 27){format(deathreason, sizeof(deathreason), "Combat Shotgun");}
        if(reason == 28){format(deathreason, sizeof(deathreason), "Micro SMG");}
        if(reason == 29){format(deathreason, sizeof(deathreason), "MP5");}
        if(reason == 30){format(deathreason, sizeof(deathreason), "AK-47");}
        if(reason == 31){format(deathreason, sizeof(deathreason), "M4");}
        if(reason == 32){format(deathreason, sizeof(deathreason), "Tec-9");}
        if(reason == 33){format(deathreason, sizeof(deathreason), "Rifle");}
        if(reason == 34){format(deathreason, sizeof(deathreason), "Sniper Rifle");}
        if(reason == 35){format(deathreason, sizeof(deathreason), "Rocket Launcher");}
        if(reason == 36){format(deathreason, sizeof(deathreason), "Rocket Launcher");}
        if(reason == 37){format(deathreason, sizeof(deathreason), "Flamethrower");}
        if(reason == 38){format(deathreason, sizeof(deathreason), "(Hunter) Minigun");}
        if(reason == 39){format(deathreason, sizeof(deathreason), "Backpack Bomb");}
        if(reason == 40){format(deathreason, sizeof(deathreason), "Detonator");}
        if(reason == 41){format(deathreason, sizeof(deathreason), "Spraycan");}
        if(reason == 42){format(deathreason, sizeof(deathreason), "Fire Extinguisher");}
        if(reason == 43){format(deathreason, sizeof(deathreason), "Camera");}
        if(reason == 44){format(deathreason, sizeof(deathreason), "Nightvision Goggles");}
        if(reason == 45){format(deathreason, sizeof(deathreason), "Infrared Goggles");}
        if(reason == 46){format(deathreason, sizeof(deathreason), "Parachute");}
        if(reason == 47){format(deathreason, sizeof(deathreason), "!>>> Unknown 47 <<<!");}
        if(reason == 48){format(deathreason, sizeof(deathreason), "!>>> Unknown 48 <<<!");}
        if(reason == 49){format(deathreason, sizeof(deathreason), "Vehicle");}
        if(reason == 50){format(deathreason, sizeof(deathreason), "Helicopter Blades");}
        if(reason == 51){format(deathreason, sizeof(deathreason), "Explosion");}
        if(reason == 52){format(deathreason, sizeof(deathreason), "!>>> Unknown 52 <<<!");}
        if(reason == 53){format(deathreason, sizeof(deathreason), "Drowned");}
        if(reason == 54){format(deathreason, sizeof(deathreason), "Splat");}
        if(reason == 55){format(deathreason, sizeof(deathreason), "!>>> Unknown 55 <<<!");}
        if(reason == 255){format(deathreason, sizeof(deathreason), "Died");}
        return 1;
}
Dit laat een kill list zien links op het scherm.
Ik weet zeker dat die code werkt maar hij valt ook korter te doen volgensmij is dat deze:
pawn Код:
public OnPlayerDeath(playerid, killerid, reason)
{
    SendDeathMessage(killerid, playerid, reason);
    return 1;
}
Ik ben er niet zeker van of die ook werkt maar denk het wel..

de kill list ziet er dan zo uit:


Ik hoop jullie hier wat mee geholpen te hebben
Reply
#9

Ik heb nog een laatste command namelijk:

7e command: /clearchat

Dit command stuurt lege tekst berichten naar de player zodat de chat is verdwenen.

pawn Код:
if(strcmp(cmdtext,"/clearchat",true)==0)
                {
                        SendClientMessage(playerid,0xFFFFFFAA," ");
                        SendClientMessage(playerid,0xFFFFFFAA," ");
                        SendClientMessage(playerid,0xFFFFFFAA," ");
                        SendClientMessage(playerid,0xFFFFFFAA," ");
                        SendClientMessage(playerid,0xFFFFFFAA," ");
                        SendClientMessage(playerid,0xFFFFFFAA," ");
                        SendClientMessage(playerid,0xFFFFFFAA," ");
                        SendClientMessage(playerid,0xFFFFFFAA," ");
                        SendClientMessage(playerid,0xFFFFFFAA," ");
                        SendClientMessage(playerid,0xFFFFFFAA," ");
                        SendClientMessage(playerid,0xC2A2DAAA,"Your chat is cleared!"); // deze kan je er ook uithalen want eigenlijk is die dan niet meer cleared xD
                return 1;
                }
Reply
#10

Swell, ik raad je aan om eens iets te lezen over loops en format.

pawn Код:
//-- Script voor format:
public OnPlayerDeath(playerid, killerid, reason)
{
    SendDeathMessage(killerid, playerid, reason);

    //Als je alleen rechts zo een death list wil hebben, en niet nog een message erbij, dan is dit hieronder onnodig.
    new str1[128];
    GetWeaponName(reason, str1, 128);
    if(strlen(str1) > 0) //Als het geen invalid weapon is (Tip: gebruik fix include van ****** om GetWeaponName te fixen, want het returnt de goede ID niet bij wapen IDs 18, 44 en 45.
    {
        new killername[MAX_PLAYER_NAME], playername[MAX_PLAYER_NAME];
        GetPlayerName(killerid, killername, MAX_PLAYER_NAME);
        GetPlayerName(playerid, playername, MAX_PLAYER_NAME);
        format(str1, 128, "(!) %s has killed %d with a(n) %s",  killername, playername, str1);
        SendClientMessageToAll(-1, str1);
    }
    return 1;
}
ClearChat. Gemakkelijk om te gebruiken:
pawn Код:
stock ClearChat(playerid)
{
    //Hiermee clear je de volledige chat van de speler. Page up en down zijn niet meer mogelijk.
    //Let op: Als je timestamp aan hebt, zie je nog wel de timestamp, maar geen enkele text erna.

    for(new i; i < 100; i++) //Geef een empty line voor 100x
    {
        SendClientMessage(playerid, -1, " "); //Color = -1 (wit). Toch is het ook heel handig om color 0 te hebben. Hiermee zijn timestamps moeilijker te lezen (want de outline kleur is ook zwart). Is niet nodig though.
    }
    return 1;
}
///////////////////////////////////////////////
Mijn code die ik zelf gebruik voor mijn AFK systeem (pas hem aan zodat hij bij je gamemode past plx)

pawn Код:
public OnPlayerUpdate(playerid)
{
    PlayerInfo[playerid][LastUpdate]  = GetTickCount();
    return 1;
}

//-- Dus, hoe bekijk je of iemand AFK is? Dat doe je zo:
if(GetTickCount()-PlayerInfo[playerid][LastUpdate] > 5000)
{
    //Iemand is AFK!
}
Ik gebruik 5000 omdat dat nogal een redelijk getal is. Laggers worden niet zo snel als AFK gemarkeert.
Gebruik een standaard boolean om een AFK/back 'systeem' te maken.

///////////////////////////////////////////////

Trouwens, ik vraag me werkelijk af waarom niemand in dit topic zcmd, ycmd of tenminste een goede command processor heeft gebruikt: ze zijn veel sneller en veel gemakkelijk om te gebruiken. Noobs leren door strcmp nog steeds de trage manier om dit te doen.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)