Jump to content

Dyanmic Pickup system


Recommended Posts

Geplaatst:

Nou, ik ben bezig met een systeempje waar je pickups kan plaatsen via command, die je ook nog is kan 'enteren' dat je naar een interiorID word gestuurd.

Voor die script had Big Boss mij al geholpen. Nu wil ik dus dat je ze kan plaatsen via een command te typen.

Maar ik heb heel veel dingen geprobeert, zoals stock.. Maar ik kom er niet uit!

Dit is de code die het meest faalt, ik weet waarom hij faalt dus daar hoef je geen uitleg over te geven, tenzij je echt wilt. Ik hoop dat jullie mij hiermee kunnen helpen.

new PickupData[][PDATA] =
{
new Float:oX, Float:oY, Float:oZ, Float:iX, Float:iY, Float: iZ, IntID;

if(dini_Exists("PickupData/1.txt")) { // FILE 1
oX = dini_Float("PickupData/1.txt","oX"); // Outside X
oY = dini_Float("PickupData/1.txt","oY"); // Outside Y
oZ = dini_Float("PickupData/1.txt","oZ"); // Outside Z
iX = dini_Float("PickupData/1.txt","iX"); // Inside X
iY = dini_Float("PickupData/1.txt","iY"); // Inside Y
iZ = dini_Float("PickupData/1.txt","iZ"); // Inside Z
IntID = dini_Int("PickupData/1.txt", "IntID");
{oX, oY, oZ, iX, iY, iZ, IntID},
}
if(dini_Exists("PickupData/2.txt")) { // FILE 2
oX = dini_Float("PickupData/2.txt","oX"); // Outside X
oY = dini_Float("PickupData/2.txt","oY"); // Outside Y
oZ = dini_Float("PickupData/2.txt","oZ"); // Outside Z
iX = dini_Float("PickupData/2.txt","iX"); // Inside X
iY = dini_Float("PickupData/2.txt","iY"); // Inside Y
iZ = dini_Float("PickupData/2.txt","iZ"); // Inside Z
IntID = dini_Int("PickupData/2.txt", "IntID");
{oX, oY, oZ, iX, iY, iZ, IntID},
}
if(dini_Exists("PickupData/3.txt")) { // FILE 3
oX = dini_Float("PickupData/3.txt","oX"); // Outside X
oY = dini_Float("PickupData/3.txt","oY"); // Outside Y
oZ = dini_Float("PickupData/3.txt","oZ"); // Outside Z
iX = dini_Float("PickupData/3.txt","iX"); // Inside X
iY = dini_Float("PickupData/3.txt","iY"); // Inside Y
iZ = dini_Float("PickupData/3.txt","iZ"); // Inside Z
IntID = dini_Int("PickupData/3.txt", "IntID");
{oX, oY, oZ, iX, iY, iZ, IntID},
}
if(dini_Exists("PickupData/4.txt")) { // FILE 4
oX = dini_Float("PickupData/4.txt","oX"); // Outside X
oY = dini_Float("PickupData/4.txt","oY"); // Outside Y
oZ = dini_Float("PickupData/4.txt","oZ"); // Outside Z
iX = dini_Float("PickupData/4.txt","iX"); // Inside X
iY = dini_Float("PickupData/4.txt","iY"); // Inside Y
iZ = dini_Float("PickupData/4.txt","iZ"); // Inside Z
IntID = dini_Int("PickupData/4.txt", "IntID");
{oX, oY, oZ, iX, iY, iZ, IntID},
}
if(dini_Exists("PickupData/5.txt")) { // FILE 5
oX = dini_Float("PickupData/5.txt","oX"); // Outside X
oY = dini_Float("PickupData/5.txt","oY"); // Outside Y
oZ = dini_Float("PickupData/5.txt","oZ"); // Outside Z
iX = dini_Float("PickupData/5.txt","iX"); // Inside X
iY = dini_Float("PickupData/5.txt","iY"); // Inside Y
iZ = dini_Float("PickupData/5.txt","iZ"); // Inside Z
IntID = dini_Int("PickupData/5.txt", "IntID");
{oX, oY, oZ, iX, iY, iZ, IntID},
}
if(dini_Exists("PickupData/6.txt")) { // FILE 6
oX = dini_Float("PickupData/6.txt","oX"); // Outside X
oY = dini_Float("PickupData/6.txt","oY"); // Outside Y
oZ = dini_Float("PickupData/6.txt","oZ"); // Outside Z
iX = dini_Float("PickupData/6.txt","iX"); // Inside X
iY = dini_Float("PickupData/6.txt","iY"); // Inside Y
iZ = dini_Float("PickupData/6.txt","iZ"); // Inside Z
IntID = dini_Int("PickupData/6.txt", "IntID");
{oX, oY, oZ, iX, iY, iZ, IntID},
}
if(dini_Exists("PickupData/7.txt")) { // FILE 7
oX = dini_Float("PickupData/7.txt","oX"); // Outside X
oY = dini_Float("PickupData/7.txt","oY"); // Outside Y
oZ = dini_Float("PickupData/7.txt","oZ"); // Outside Z
iX = dini_Float("PickupData/7.txt","iX"); // Inside X
iY = dini_Float("PickupData/7.txt","iY"); // Inside Y
iZ = dini_Float("PickupData/7.txt","iZ"); // Inside Z
IntID = dini_Int("PickupData/7.txt", "IntID");
{oX, oY, oZ, iX, iY, iZ, IntID},
}
if(dini_Exists("PickupData/8.txt")) { // FILE 8
oX = dini_Float("PickupData/8.txt","oX"); // Outside X
oY = dini_Float("PickupData/8.txt","oY"); // Outside Y
oZ = dini_Float("PickupData/8.txt","oZ"); // Outside Z
iX = dini_Float("PickupData/8.txt","iX"); // Inside X
iY = dini_Float("PickupData/8.txt","iY"); // Inside Y
iZ = dini_Float("PickupData/8.txt","iZ"); // Inside Z
IntID = dini_Int("PickupData/8.txt", "IntID");
{oX, oY, oZ, iX, iY, iZ, IntID},
}
if(dini_Exists("PickupData/9.txt")) { // FILE 9
oX = dini_Float("PickupData/9.txt","oX"); // Outside X
oY = dini_Float("PickupData/9.txt","oY"); // Outside Y
oZ = dini_Float("PickupData/9.txt","oZ"); // Outside Z
iX = dini_Float("PickupData/9.txt","iX"); // Inside X
iY = dini_Float("PickupData/9.txt","iY"); // Inside Y
iZ = dini_Float("PickupData/9.txt","iZ"); // Inside Z
IntID = dini_Int("PickupData/9.txt", "IntID");
{oX, oY, oZ, iX, iY, iZ, IntID},
}
if(dini_Exists("PickupData/10.txt")) { // FILE 10
oX = dini_Float("PickupData/10.txt","oX"); // Outside X
oY = dini_Float("PickupData/10.txt","oY"); // Outside Y
oZ = dini_Float("PickupData/10.txt","oZ"); // Outside Z
iX = dini_Float("PickupData/10.txt","iX"); // Inside X
iY = dini_Float("PickupData/10.txt","iY"); // Inside Y
iZ = dini_Float("PickupData/10.txt","iZ"); // Inside Z
IntID = dini_Int(file10, "IntID");
{oX, oY, oZ, iX, iY, iZ, IntID}
}
if(dini_Exists("PickupData/11.txt")) { // FILE 11
oX = dini_Float("PickupData/11.txt","oX"); // Outside X
oY = dini_Float("PickupData/11.txt","oY"); // Outside Y
oZ = dini_Float("PickupData/11.txt","oZ"); // Outside Z
iX = dini_Float("PickupData/11.txt","iX"); // Inside X
iY = dini_Float("PickupData/11.txt","iY"); // Inside Y
iZ = dini_Float("PickupData/11.txt","iZ"); // Inside Z
IntID = dini_Int("PickupData/11.txt", "IntID");
{oX, oY, oZ, iX, iY, iZ, IntID},
}
if(dini_Exists("PickupData/12.txt")) { // FILE 12
oX = dini_Float("PickupData/12.txt","oX"); // Outside X
oY = dini_Float("PickupData/12.txt","oY"); // Outside Y
oZ = dini_Float("PickupData/12.txt","oZ"); // Outside Z
iX = dini_Float("PickupData/12.txt","iX"); // Inside X
iY = dini_Float("PickupData/12.txt","iY"); // Inside Y
iZ = dini_Float("PickupData/12.txt","iZ"); // Inside Z
IntID = dini_Int("PickupData/12.txt", "IntID");
{oX, oY, oZ, iX, iY, iZ, IntID},
}
if(dini_Exists("PickupData/13.txt")) { // FILE 13
oX = dini_Float("PickupData/13.txt","oX"); // Outside X
oY = dini_Float("PickupData/13.txt","oY"); // Outside Y
oZ = dini_Float("PickupData/13.txt","oZ"); // Outside Z
iX = dini_Float("PickupData/13.txt","iX"); // Inside X
iY = dini_Float("PickupData/13.txt","iY"); // Inside Y
iZ = dini_Float("PickupData/13.txt","iZ"); // Inside Z
IntID = dini_Int("PickupData/13.txt", "IntID");
{oX, oY, oZ, iX, iY, iZ, IntID},
}
if(dini_Exists("PickupData/14.txt")) { // FILE 14
oX = dini_Float("PickupData/14.txt","oX"); // Outside X
oY = dini_Float("PickupData/14.txt","oY"); // Outside Y
oZ = dini_Float("PickupData/14.txt","oZ"); // Outside Z
iX = dini_Float("PickupData/14.txt","iX"); // Inside X
iY = dini_Float("PickupData/14.txt","iY"); // Inside Y
iZ = dini_Float("PickupData/14.txt","iZ"); // Inside Z
IntID = dini_Int("PickupData/14.txt", "IntID");
{oX, oY, oZ, iX, iY, iZ, IntID},
}
if(dini_Exists("PickupData/15.txt")) { // FILE 15
oX = dini_Float("PickupData/15.txt","oX"); // Outside X
oY = dini_Float("PickupData/15.txt","oY"); // Outside Y
oZ = dini_Float("PickupData/15.txt","oZ"); // Outside Z
iX = dini_Float("PickupData/15.txt","iX"); // Inside X
iY = dini_Float("PickupData/15.txt","iY"); // Inside Y
iZ = dini_Float("PickupData/15.txt","iZ"); // Inside Z
IntID = dini_Int("PickupData/15.txt", "IntID");
{oX, oY, oZ, iX, iY, iZ, IntID}
}
};

Geplaatst:

Volgens mij had je die code ook al naar mij gestuurd in een PM, maar ik heb nog geen tijd gehad om die te bekijken. Dus bij deze.

Ik snap wel waar je naartoe wilt, maar dit zal zo niet werken.

Je zal het op zo'n manier moeten doen:

new 
   PickupData[][PDATA];

new 
   i = 1,
   j = 0,
   file[32];

file = "PickupData/1.txt";

while(dini_Exists(file))
{
   j = i - 1; // Dit is zodat slot 0 van de array ook gevuld wordt.

   printf("Loading: \'%s\' ...", file);

   PickupData[j][oX] = dini_Float(file, "oX");
   PickupData[j][oY] = dini_Float(file, "oY");
   PickupData[j][oZ] = dini_Float(file, "oZ");
   // etc.

   i++;
   format(file, sizeof(file), "PickupData/%d.txt", i);
}
printf("Loaded information from %d files.", i - 1);

Het script zal automatisch stoppen met zoeken als het een bestand tegenkomt dat niet bestaat.

Als je bijvoorbeeld 1.txt, 2.txt, 3.txt en 5.txt hebt, zullen alleen de eerste 3 bestanden geladen worden omdat 4.txt niet gevonden kan worden.

Geplaatst: (bewerkt)

Bedankt, maar ik neem aan dat ik dit in een 'functie' moet zetten? zoals stock, forward(public)?

Als ik de script een beetje afrond, geeft hij vooral warnings aan over dat 'i' en 'j' een variable schaduwd bij een voorafgaande niveau.

En errors dat bijvoorbeld 'file=' een ongeldige expressie heeft.

Edit: Ik was dit vergeten toe te voegen:

Als ik het in, bijvoorbeeld, een stock zet, zal ik zowiezo alle andere 'scripts' ook moeten bijpassen, zoals /enter, /exit en dat het een pickup plaatst, want hij kan de gedefinde 'pickup' niet vinden.

Bewerkt: door Gast
quote verwijderd
Geplaatst:

Dit stukje code plaats je bij voorkeur in OnGameModeInit (inclusief new i, j en file). Als de server dan start worden de bestanden ingelezen en wordt er een waarde toegekend aan alle attributen (enum) van die grote array. Die waardes kan je vervolgens gebruiken om de pickups daadwerkelijk te plaatsen.

Als ik me niet vergis heb ik je trouwens ook een script gegeven (d.m.v. een for-loop) waarmee je kan checken bij welke pickup de speler zich op dat moment bevindt, klopt dat?

Geplaatst: (bewerkt)

Dit stukje code plaats je bij voorkeur in OnGameModeInit (inclusief new i, j en file). Als de server dan start worden de bestanden ingelezen en wordt er een waarde toegekend aan alle attributen (enum) van die grote array. Die waardes kan je vervolgens gebruiken om de pickups daadwerkelijk te plaatsen.

Als ik me niet vergis heb ik je trouwens ook een script gegeven (d.m.v. een for-loop) waarmee je kan checken bij welke pickup de speler zich op dat moment bevindt, klopt dat?

Dat klopt. Maar als ik dat stukje code bij OnGameModeInit zet, zal mijn /enter commando niet meer werken. Dan kent hij Pickupdata niet meer.

Edit: dit is de loop, die onder andere nu errors aangeeft: for(new i; i < sizeof(PickupData); i++)

Als ik new PickupData[][[PDATA]; boven aan de script zet, krijg ik weer allemaal errors dat "i" bij een preceeding level is. Dat PDATA niet gedefined is, hij zegt dat:

    PickupData[j][oX] = dini_Float(file, "oX");
   PickupData[j][oY] = dini_Float(file, "oY");
   PickupData[j][oZ] = dini_Float(file, "oZ");
   PickupData[j][iX] = dini_Float(file, "iX");
   PickupData[j][iY] = dini_Float(file, "iY");
   PickupData[j][iZ] = dini_Float(file, "iZ");
   PickupData[j][intID] = dini_Int(file, "IntID");

allemaal een tagmismatch is

En nog wat warnings/errors :/

Bewerkt: door Gast
Geplaatst:

Heb je nog een i bovenaan bij je globale variabelen staan? Als dat zo is, kan je twee dingen doen:

Ofwel de globale i weghalen en hopen dat dat geen nieuwe errors geeft (Undefined Symbol) .. Of de lokale i in het stukje code dat ik je gaf hernoemen naar iets anders.

En zou je je enum van PDATA eens willen laten zien? Mogelijk mis je nog enkele tags.

Geplaatst:

Heb je nog een i bovenaan bij je globale variabelen staan? Als dat zo is, kan je twee dingen doen:

Ofwel de globale i weghalen en hopen dat dat geen nieuwe errors geeft (Undefined Symbol) .. Of de lokale i in het stukje code dat ik je gaf hernoemen naar iets anders.

En zou je je enum van PDATA eens willen laten zien? Mogelijk mis je nog enkele tags.

Ik heb i vernoemd naar thei. Ik krijg nu nog tag mismatch, enz.

Dit is de enum van PDATA:

enum PDATA
{
Float:lx1,
Float:ly1,
Float:lz1,
Float:lx2,
Float:ly2,
Float:lz2,
InteriorId
}

Geplaatst:

Ja, met die enum is het dus volkomen logisch dat ie de waarden niet herkent.

    
   PickupData[j][lx1] = dini_Float(file, "oX");
   PickupData[j][ly1] = dini_Float(file, "oY");
   PickupData[j][lz1] = dini_Float(file, "oZ");
   PickupData[j][lx2] = dini_Float(file, "iX");
   PickupData[j][ly2] = dini_Float(file, "iY");
   PickupData[j][lz2] = dini_Float(file, "iZ");
   PickupData[j][interiorId] = dini_Int(file, "IntID");

Dit zou het moeten doen dan.

Geplaatst:

Ja, met die enum is het dus volkomen logisch dat ie de waarden niet herkent.

    
   PickupData[j][lx1] = dini_Float(file, "oX");
   PickupData[j][ly1] = dini_Float(file, "oY");
   PickupData[j][lz1] = dini_Float(file, "oZ");
   PickupData[j][lx2] = dini_Float(file, "iX");
   PickupData[j][ly2] = dini_Float(file, "iY");
   PickupData[j][lz2] = dini_Float(file, "iZ");
   PickupData[j][interiorId] = dini_Int(file, "IntID");

Dit zou het moeten doen dan.

Oke, bedankt.

Alleen ik krijg nu wat warnings waar ik nog nooit van gehoord heb, dus daarom heb ik besloten het toch maar even te posten.

1e gedeelte

warning 224: indeterminate array size in "sizeof" expression (symbol "")
Bij:
for(new i; i < sizeof(PickupData); i++)

2e gedeelte

warning 224: indeterminate array size in "sizeof" expression (symbol "")
Bij:
for(new i; i < sizeof(PickupData); i++)

3e gedeelte

warning 224: indeterminate array size in "sizeof" expression (symbol "")
Bij:
for(new i; i < sizeof(PickupData); i++)

Geplaatst:

Er zijn zowat 3 manieren om deze error weg te werken, maar ze zijn alle drie nogal omslachtig.

Manier 1: Van je variabele een constante maken. Dit zal waarschijnlijk niet echt een optie zijn, aangezien de waarden wijzigbaar moeten zijn vanuit het script.

new const PickupData[][PDATA];

Manier 2: Een effectieve waarde toekennen aan je variabele.

#define MAX_DYN_PICKUPS 40
new PickupData[MAX_DYN_PICKUPS][PDATA];

Manier 3: Een functie om de upper bound van de array te berekenen.

Dit is veel ingewikkelder en moet ik toch nog eens grondig testen; aangezien het een multidimensionale array betreft, in combinatie met een enum.

Geplaatst:

Oké, bedankt.

Trouwens, als ik een nieuw bestaan aan maak, zal ie dan alleen '1.txt' lezen, of ook '2.txt', enzovoort, als ik ze aanmaak?

Geplaatst:

Ja, maar vanaf het ogenblik dat er een bestand tussen uit valt zal het script stoppen.

Dus als je bijvoorbeeld 1 tot en met 5 hebt zullen ze alle vijf geladen worden, maar als je enkel 1,2,3 en 5 hebt zullen enkel de eerste 3 geladen worden.

Geplaatst: (bewerkt)

Ja, maar vanaf het ogenblik dat er een bestand tussen uit valt zal het script stoppen.

Dus als je bijvoorbeeld 1 tot en met 5 hebt zullen ze alle vijf geladen worden, maar als je enkel 1,2,3 en 5 hebt zullen enkel de eerste 3 geladen worden.

Danku :)

Weet je misschien ook hoe ik strings kan verwerken in de .txt bestanden?

Zodra ik een string wil opvangen, krijg ik een error.

   PickupData[j][EntPUMessage] = dini_Get(file, "EntPUMess");
   PickupData[j][ExPUMessage] = dini_Get(file, "ExPUMess");

Hij zegt dat ze niet assigned zijn aan een array. Ik heb meerdere dingen geprobeert.

Ik had nog een idee om het ergens anders te plaatsen, maar dan kan ik de bestandsnaam niet ontvangen.

De exacte error:

error 006: must be assigned to an array
error 006: must be assigned to an array

p/s Kan deze post gemerged worden met de gene hierboven? >>> Door Big Boss: Op uw verzoek. Graag even op letten, volgende keer. <<<

Bewerkt: door Gast
Geplaatst:

Die error lijkt me vrij duidelijk.

Je moet van je variabele - in je enum - een array (string) maken. Ik neem aan dat je weet hoe dat moet? ;)

Lekkere dialoog tussen ons twee, trouwens .. :7

Geplaatst: (bewerkt)

Die error lijkt me vrij duidelijk.

Je moet van je variabele - in je enum - een array (string) maken. Ik neem aan dat je weet hoe dat moet? ;)

Lekkere dialoog tussen ons twee, trouwens .. :7

Ojah, was ik vergeten te vertellen.

Ik had hem zo genoemd:

EntPUMessage[156],

ExPUMessage[156]

in de Enum, maar dat leverde ook weer twee errors op, deze:

error 047: array sizes do not match, or destination array is too small
error 047: array sizes do not match, or destination array is too small

Edit: Oké, ik weet wat de error inhoud. maar ik kan nu nog steeds niks. :ch:

Deze error heb ik ook dus nog nooit eerder gehad. :(

Lekkere dialoog tussen ons twee, trouwens .. :7

Haha :)

Bewerkt: door Gast

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...

×   Je hebt text geplaatst met opmaak.   Opmaak verwijderen

  Only 75 emoji are allowed.

×   Je link is automatisch ingevoegd.   In plaats daarvan weergeven als link

×   Je vorige bewerkingen zijn hersteld.   Alles verwijderen

×   You cannot paste images directly. Upload or insert images from URL.

  • Recent actief   0 leden

    • Er zijn hier geen geregistreerde gebruikers aanwezig.
×
×
  • Create New...