Jump to content
Geplaatst:
comment_805528

Tutorial Objecten



Gemaakt door Sandra18[NL]

**In deze tutorial leg ik jullie uit hoe je objecten kunt maken, vernietigen, verplaatsen en draaien.

Wat heb je nodig:

- Pawno

- Sa:mp 0.2.* Script-tools

- Basis scriptkennis

- En niet te vergeten een kop koffie :7

Sinds sa:mp 0.2 is uitgebracht is het mogelijk om zelf objecten aan een server toe te voegen.

Dit word dan ook veel gedaan.

Veel beginners willen graag poorten in hun server hebben, maar hebben geen idee hoe ze dat moeten aanpakken.

Daarom heb ik maar deze tutorial gemaakt.

Vragen zijn natuurlijk altijd welkom.

Goed, om te beginnen leg ik eerst kort uit welke functies we gaan gebruiken:

- CreateObject(model-id, X, Y, Z, X-rot, Y-rot, Z-rot);

- DestroyObject(object-id)

- MoveObject(object-id, nieuwe-X, nieuwe-Y, nieuwe-Z, snelheid)

- SetObjectRot(id, nieuwe-X-rot, nieuwe-Y-rot, nieuwe-Z-rot);

Als voorbeeld nemen we als object een hek. (model-id = 974)

Deze zetten we in het midden van GroveStreet.

Coördinaten: (2486.0, -1667.0, 13.0).

Om je script ordelijk te houden, is het verstandig om de objecten namen te geven. Zo kan je ze makkelijk uit elkaar houden.

Wij zullen ons hek de naam 'Poort' geven. (Let op de hoofdletter P)

Daarvoor moeten we dus een nieuw variabele maken.

We maken 3 verschillende commando's:

/open

/close

/destroy

We gebruiken SendClientMessage met de kleur groen. (die moeten we dus nog definieren)

We beginnen dus met:

#include <a_samp>
#define COLOR_GREEN 0x00FF00AA

new Poort;

Dan volgt de 'main' (Dit zie je in de console verscheinen)

main()
{
print("\n00000000000000000000000000000000");
print("TutorialGameMode by Sandra18[NL]");
print("00000000000000000000000000000000\n");
}

Vervolgende de OnGameModeInit() (Hier moet alles instaan wat er tijdens het opstarten van de gamemode moet gebeuren.

Normaal zet je hier altijd de AddPlayerClasses en AddStaticVehicles neer.

Hier moet je dus ook de CreateObject-functie plaatsen omdat het hek bij het opstarten van de gamemode al aanwezig moet zijn:

public OnGameModeInit()
{
SetGameModeText("TutorialGameMode");
AddPlayerClass(93, 2494.4888, -1675.5619, 13.3359, 55.9011,0,0,0,0,0,0); // 1 spawnplek

//CreateObject(id, X, Y, Z, X-rotatie, Y-rotatie, Z-rotatie); 
//Je kunt het object een naam geven op deze manier:
Poort = CreateObject(974, 2486.0,-1667.0,13.0, 0.0,0.0,0.0);

return 1;
}

Dan nog het gedeelten waar je je karakter moet uitkiezen. (Voorbeeld):

public OnPlayerRequestClass(playerid, classid)
{
SetPlayerPos(playerid,-812.0018,-1949.3617,9.3004); // Waar de speler te zetten voor het spawn-menu
SetPlayerCameraPos(playerid,-816.4528,-1945.0082,9.0269); // Camera voor het spawn-menu
SetPlayerCameraLookAt(playerid,-812.0018,-1949.3617,9.3004); // Waar moet de camera naar toe kijken?
return 1;
}

Nu is het tijd voor de commando's:

Het commando /destroy:

if (strcmp("/destroy", cmdtext, true, 10) == 0)  // invoer van het commando
{
DestroyObject(Poort);  // functie om het object te vernietigen
SendClientMessage(playerid, COLOR_GREEN, "De poort is nu vernietigd."); // verzend een bericht
return 1;
}

Het commando: /open:

Ik zet in dit commando alle 6 manieren om een poort te bewegen:

- Verschuiven over de X-as

- Verschuiven over de Y-as

- Verschuiven over de Z-as

- Roteren t.o.v. de X-as

- Roteren t.o.v. de Y-as

- Roteren t.o.v. de Z-as

Ik scheid elke manier door 2 slashes //

Zo kan je van die functiee een 'aantekening' maken, en dus word die functie niet gebruikt.

Voor de snelheid van het bewegen gebruiken we nu '3' en we zullen bij de rotaties telkens met een hoek van 90 graden draaien.

De begin positie van de poort is: 2486.0,-1667.0,13.0

-Om de poort te verschuiven langs de X-as, dan verhoog je de 2486.0:

MoveObject(Poort, 2495.0, -1667.0, 13.0, 3);

-Om de poort te verschuiven langs de Y-as, dan verhoog je de -1667.0:

MoveObject(Poort, 2486.0, -1660.0, 13.0, 3);

-Om de poort te verschuiven langs de Z-as, dan verhoog je de 13.0:

MoveObject(Poort, 2486.0, -1667.0, 20.0, 3);

De standaard rotatie van de Poort is 0, 0, 0

-Om de poort t.o.v. de X-as te roteren, dan verhoog je de 1e 0:

SetObjectRot(Poort, 90, 0, 0);

-Om de poort t.o.v. de Yas te roteren, dan verhoog je de 2e 0:

SetObjectRot(Poort, 0, 90, 0);

-Om de poort t.o.v. de Z-as te roteren, dan verhoog je de 3e 0:

SetObjectRot(Poort, 0, 0, 90);

De code word dus als volgt:

if (strcmp("/open", cmdtext, true, 10) == 0) //Invoer van het commando
{
// MoveObject(objectid, nieuwe X, nieuwe Y, nieuwe Z, snelheid);
//MoveObject(Poort, 2495.0, -1667.0, 13.0, 3); //verplaatsing X
//MoveObject(Poort, 2486.0, -1660.0, 13.0, 3); //verplaatsing Y
//MoveObject(Poort, 2486.0, -1667.0, 20.0, 3); //verplaatsing Z 
//SetObjectRot(Poort, 90, 0, 0); //De poort draait nu 90 graden t.o.v. de X-as
//SetObjectRot(Poort, 0, 90, 0); //De poort draait nu 90 graden t.o.v. de Y-as
//SetObjectRot(Poort, 0, 0, 90); //De poort draait nu 90 graden t.o.v. de Z-as

SendClientMessage(playerid, COLOR_GREEN, "De poort is nu geopend."); //Verzend een bericht naar de speler
return 1;
}

Je hoeft alleen maar uit de bovenstaande code voor 1 van de functies de // weg te halen.

Ik heb vlug een filmpje gemaakt waarin ik de 6 verschillende bewegingen laat zien.

Dit filmpje staat onderaan dit bericht.

Om de poort te sluiten hoef je alleen maar de Poort te 'moven' naar de oude positie en de rotatie weer op de oude stand te zetten:

if (strcmp("/close", cmdtext, true, 10) == 0)
{
MoveObject(Poort, 2486.0, -1667.0, 13.0, 3);  //terug naar oude positie
SetObjectRot(Poort, 0, 0, 0); //terug naar oude rotatie
SendClientMessage(playerid, COLOR_GREEN, "De poort is nu gesloten.");
return 1;
}

Samenvatting:

Als jij een poort wilt die door het commando /open 5 stappen naar boven beweegt en met /close weer sluit, dan heb je deze code nodig:

#include <a_samp>
#define COLOR_GREEN 0x00FF00AA

new Poort;

main()
{
print("\n00000000000000000000000000000000");
print("TutorialGameMode by Sandra18[NL]");
print("00000000000000000000000000000000\n");
}


public OnGameModeInit()
{
SetGameModeText("TutorialGameMode");
AddPlayerClass(93, 2494.4888, -1675.5619, 13.3359, 55.9011,0,0,0,0,0,0);

//CreateObject(id, X, Y, Z, X-rotatie, Y-rotatie, Z-rotatie);
Poort = CreateObject(974, 2486.0,-1667.0,13.0, 0.0,0.0,0.0);

return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
SetPlayerPos(playerid,-812.0018,-1949.3617,9.3004); // Waar de speler te zetten voor het spawn-menu
SetPlayerCameraPos(playerid,-816.4528,-1945.0082,9.0269); // Camera voor het spawn-menu
SetPlayerCameraLookAt(playerid,-812.0018,-1949.3617,9.3004); // Waar moet de camera naar toe kijken?
return 1;
}


public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp("/open", cmdtext, true, 10) == 0) //Invoer van het commando
{
MoveObject(Poort, 2486.0, -1667.0, 18.0, 3); 
SendClientMessage(playerid, COLOR_GREEN, "De poort is nu geopend."); 
return 1;
}

if (strcmp("/close", cmdtext, true, 10) == 0)
{
MoveObject(Poort, 2486.0, -1667.0, 13.0, 3); 
SendClientMessage(playerid, COLOR_GREEN, "De poort is nu gesloten.");
return 1;
}

if (strcmp("/destroy", cmdtext, true, 10) == 0)
{
DestroyObject(Poort);
SendClientMessage(playerid, COLOR_GREEN, "De poort is nu vernietigd.");
return 1;
}


return 0;
}

Voor een beter uitgelijnde versie, klik >>hier<<

Tis al laat, ben niet helemaal helder meer, dus deze tutorial kan wat chaotisch zijn.

Maar als er nog vragen zijn of er iets niet duidelijk is, moet je het maar in dit topic posten.

Succes ermee

Grtz Sandra

<object width="425" height="350"><param name="movie" value="

name="wmode" value="transparent"></param><embed src="
type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object>

<font color="Red">>>> Door Azer: Toegevoegd aan het "PAWN Tutorial List" topic<<<</font>

Bewerkt: door Sandra

  • Reacties 59
  • Bezichtigingen 12k
  • Created
  • Laatste reactie

Top Posters In This Topic

Featured Replies

Geplaatst:
comment_1150674

Als je het hele tutorial had door gelezen.

dan zou je het misscihen weten:

Objecten toevoegen:

Nu weet je hoe je spawnplaatsen moet maken voor players en voor voertuigen.

Nu ga ik proberen je uit te leggen hoe je objecten kan toevoegen aan de map.

Je kan 1 simpel object toevoegen, maar je kan ook een uitgebreid eiland maken.

Er is genoeg keus, gta-sa heeft namelijk ongeveer 18.000 verschillende objecten!!

Let op: Je kan maximaal 150 objecten toevoegen, als je er meer hebt, kan je spel crashen!!

Oke, objecten toevoegen gaat bijna volgens hetzelfde principe als voertuigen & players.

Je gebruikt de volgende funcie:

 CreateObject(id, x, y, z, x-rotatie, y-rotatie, z-rotatie);

Om achter het id van een bepaald object te komen, kan je het beste een map-editor downloaden.

Je weet inmiddels hoe je de coördinaten kan krijgen, dus verdere uitleg heeft deze functie niet nodig.

dit is stukje voor object's

Bewerkt: door Nomis3

  • 4 weken later...
Geplaatst:
comment_1175514

Pawn is een versimpelde versie van C++ of in ieder geval een soort afgeleide, vandaar dat hij denkt dat het C++ is ;) Pawno kun je downloaden op de site van SA-mp, het zit gewoon bij het server-bestand inbegrepen.

Bewerkt: door VWO-er

  • 1 maand later...
Geplaatst:
comment_1226368

Ik heb een klein probleempje. Ik heb de tutorial helemaal gevolgd, en ik heb een jail proberen te maken om vervelende mensen in op te sluiten.

Nadat ik een open en close functie had gemaakt, en de nieuwe positie had aangegeven en gecompiled had ik geen problemen, maar nadat ik in mijn servertje zat, en de jail opende, ging de deur wel naar de juiste plek, maar eenmaal daar aangekomen verdween hij.

Ook als ik de close functie gebruik komt hij niet terug ( Waarschijnlijk omdat de deur op de een of andere manier verwijdert is.

Hier zijn de stukken uit het script waar het om gaat:

#include <a_samp>

new jail;

public OnGameModeInit()
{
CreateObject(980, 2532.701904, 1562.008789, 59.579155, 0.0000, 0.0000, 0.0000);
CreateObject(980, 2532.702148, 1567.604980, 59.678333, 0.0000, 0.0000, 0.0000);
CreateObject(971, 2538.437012, 1564.597534, 60.489395, 0.0000, 0.0000, 269.7592);
CreateObject(971, 2527.009033, 1564.669800, 60.412468, 0.0000, 0.8594, 268.8997);
jail = CreateObject(980, 2532.731689, 1564.857666, 56.718033, 91.1002, 0.0000, 359.1406);
CreateObject(980, 2532.651123, 1564.852417, 62.458084, 269.7592, 0.8594, 0.0000);
}

public OnPlayerCommandTest(playerid, cmdtext[])
{
if (strcmp("/openjail", cmdtext, true, 10) == 0)
{
	MoveObject(jail, 2521.057129, 1565.022461, 56.718033, 3);
	SendClientMessage(playerid, 0xFFFFFFAA, "It's Suicide Time.");
	return 1;
}

if (strcmp("/closejail", cmdtext, true, 10) == 0)
{
	MoveObject(jail, 2527.009033, 1564.669800, 56.718033, 3);
	SendClientMessage(playerid, 0xFFFFFFAA, "Jail is Closed.");
	return 1;
}
}

Bewerkt: door Cloud

  • 1 year later...
Geplaatst:
comment_1570957

Hoe maak je nou precies iets op Clantag? (bijv. [LSP]) Ik had al iets geprobeert van if(!strfind(playername, "[LSP]", true)) en dan had ik er }else{ aan geadd met

SendClientMessage(playerid, 0xFF0000AA, "You aren't a part of the Cop Team!"); en nu steeds als ik [LSP] aan men naam add komt dat er steeds te staan :S. Zou iemand mij hiermee kunnen helpen aub/?

Geplaatst:
comment_1570970

Je kan ook zoiets als dit proberen:

if(!strcmp(playername, "[LSP]", true, 5) // 5 zodat hij niet verder kijkt dan de 1e 5 karakters van de string.
{
    // Hij heeft [LSP] voor zijn naam staan.
}
else
{
    // Hij heeft NIET [LSP] voor zijn naam staan.
}

Geplaatst:
comment_1571020

Je kan ook zoiets als dit proberen:

if(!strcmp(playername, "[LSP]", true, 5) // 5 zodat hij niet verder kijkt dan de 1e 5 karakters van de string.
{
    // Hij heeft [LSP] voor zijn naam staan.
}
else
{
    // Hij heeft NIET [LSP] voor zijn naam staan.
}

maar het is tog strfind?

Geplaatst:
comment_1571065

Je kan ook zoiets als dit proberen:

if(!strcmp(playername, "[LSP]", true, 5) // 5 zodat hij niet verder kijkt dan de 1e 5 karakters van de string.
{
    // Hij heeft [LSP] voor zijn naam staan.
}
else
{
    // Hij heeft NIET [LSP] voor zijn naam staan.
}

maar het is tog strfind?

Strcmp vergelijkt (delen) van strings met elkaar. Deze code zorgt ervoor dat hij de eerste 5 karakters met elkaar vergelijkt. Maar dat het niet werkt vind ik vaag. Het werkt bij mij namelijk wel. Kunnen wij de volledige code zien die je voor dat stukje vergelijkt? (Staat er ook GetPlayerName in bijvoorbeeld?)

Geplaatst:
comment_1572322

Er zit een foutje in de tut

er staat

-Om de poort te verschuiven langs de X-as, dan verhoog je de 2486.0:

MoveObject(Poort, 2495.0, -1667.0, 13.0, 3);

-Om de poort te verschuiven langs de Y-as, dan verhoog je de -1667.0:

MoveObject(Poort, 2486.0, -1660.0, 13.0, 3);

-Om de poort te verschuiven langs de X-as, dan verhoog je de 13.0:

MoveObject(Poort, 2486.0, -1667.0, 20.0, 3);

maar dat moet zijn

-Om de poort te verschuiven langs de X-as, dan verhoog je de 2486.0:

MoveObject(Poort, 2495.0, -1667.0, 13.0, 3);

-Om de poort te verschuiven langs de Y-as, dan verhoog je de -1667.0:

MoveObject(Poort, 2486.0, -1660.0, 13.0, 3);

-Om de poort te verschuiven langs de Z-as, dan verhoog je de 13.0:

MoveObject(Poort, 2486.0, -1667.0, 20.0, 3);

>>> Door Sandra: Thnx, fixed<<<

  • 6 maanden later...
Geplaatst:
comment_1695081

Ik zet hier ook nog wel even bij hoe je streamed objects moved (in dit geval MidoStream).

De functies:

/* CreateStreamObject(modelid,Float:xpos,Float:ypos,Float:zpos,Float:xrot,Float:yrot,Float:zrot,Float:viewdist) - Maakt een nieuw stream object aan.
DestroyStreamObject(id) - Verwijderd een stream object.
GetStreamObjectPos(id,&Float:xpos,&Float:ypos,&Float:zpos) - Vraagt de positie van het streamed object op.
GetStreamObjectRot(id,&Float:xrot,&Float:yrot,&Float:zrot) - Vraagt de rotatie van het streamed object op.
SetStreamObjectPos(id,Float:xpos,Float:ypos,Float:zpos) - Veranderd de positie van een streamed object.
SetStreamObjectRot(id,Float:xrot,Float:yrot,Float:zrot) - Veranderd de rotatie van een streamed object.
AttachStreamObjectToPlayer(id,playerid,Float:xoff,Float:yoff,Float:zoff,Float:xrot,Float:yrot,Float:zrot) - Maakt een object vast aan een speler.
MoveStreamObject(id,Float:movx,Float:movy,Float:movz,Float:speed) - Verplaatst een streamed object.
MidoStreamDisconnect(playerid) - Dit zinnetje moet in je GameMode onder OnPlayerDisconnect. */

CreateStreamObject(modelid,Float:xpos,Float:ypos,Float:zpos,Float:xrot,Float:yrot,Float:zrot,Float:viewdist);

Je maps kan je simpel weg converten naar MidoStream objects bijvoorbeeld met deze converter: http://gtamap.delux-host.com/converter/

Je zet de CreateStreamObject gewoon onder OnFilterScriptInit.

Voor de rest gaat bijna alles hetzelfde alleen met commands gaat het zo:

new poort;
poort = CreateStreamObject(974, 2486.0, -1667.0, 13.0, 0.0, 0.0, 0.0, 500); // Dit is dezelfde positie als die Sandra gebruikt maar dan in CreateStreamObject.

   if(!strcmp("/open", cmdtext, true, 10))
{
       if(IsPlayerInRangeOfPoint(playerid, 10.0, 1577.283081, -1624.715820, 13.421875)) 
       {
    [b]MoveStreamObject[/b](poort, 1577.283081, -1624.715820, 13.421875, 2);
    SendClientMessage(playerid, 0xFFFFFFAA,"De poort is geopend.");
    return 1;
}

De functies spreken voor de rest voor zich.

Download:

http://solidfiles.com/d/4x9O/

Hier kan je de MidoStream downloaden je moet alleen nog wel een paar zinnetjes toevoegen.

Zoek op: forward Core_CreateStreamObject(modelid2,Float:xpos2,Float:ypos2,Float:zpos2,Float:xrot2,Float:yrot2,Float:zrot2,Float:viewdist2);

En zet dit boven dat zinnetje: #define CreateStreamObject Core_CreateStreamObject

Zoek op: forward Core_MoveStreamObject(id2,Float:movx2,Float:movy2,Float:movz2,Float:speed2);

En zet dit boven dat zinnetje: #define MoveStreamObject Core_MoveStreamObject

Bewerkt: door Melvin980

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.

Gast
Op dit onderwerp reageren...

Recent actief 0

  • Er zijn hier geen geregistreerde gebruikers aanwezig.