Du kannst bei applyanimation in einem der Parameter angeben ob er gefreezed werden soll oder nicht
[SAMMELTHREAD] Kleine Scripting Fragen
- Rafelder
- Unerledigt
Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!
Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
-
-
Warum bringt das hier den Compiler zu crashen?
Cnew ActorPickups[NUM_ACTORS]; #if !defined NUM_WEAPONS #error NUM_WEAPONS must be defined!!! #endif new GeneralPickupInfo[MAX_PICKUPS][MAX_PICKUPS][MAX_PICKUPS]; new InfoPickups[sizeof(PlayerInfoPickups)]; new MoneyPickups[MAX_PICKUPS-sizeof(ActorPickups)-sizeof(InfoPickups)-sizeof(GeneralPickupInfo)-1];
MAX_PICKUPS ist auf 20000
-
Probier es mal mit einem kleinerem max pickups wert. Bin der Meinung er ist zu hoch wenn man bedenkt dass du eine 3d variable nutzt
-
1000 habe ich auch mal probiert, mag er leider auch nicht
Scheinbar bleibt dann nur der Weg ueber 2 separate Arrays was auch wieder doof ist
1 fuer Pickup ID und 1 fuer Waffen ID und die Munition dazu
Habe eventuell noch die Idee ein 2D Array zu machen, und WaffenID und Munition in der 2. Dimension als float zu speichern , WaffenID,Munition, und dann durch shiften beides zu trennen, und die Pickupid in der ersten Dimension in einen Float zu konvertieren, und beim Auslesen wieder in einen Int
Wuerde die gerne wie folgt erzeugen
C
Alles anzeigenstock GenerateRandomWeaponPickup(weapontype,ammo,type,Float:x_max,Float:x_min,Float:y_max,Float:y_min,Float:z_max,Float:z_min,virtualworld) { if(PickupCounter[weapontype] <= sizeof(WeaponPickups)) { new Float:rx1=((frandom((floatabs(x_max-x_min)))+x_min)); new Float:ry2=((frandom((floatabs(y_max-y_min)))+y_min)); new Float:rz3=((frandom((floatabs(z_max-z_min)))+z_min)); PickupCounter[weapontype] = PickupCounter[weapontype] +1; new modelid; switch(weapontype) { case WEAPONTYPE_M4: modelid = 358; case WEAPONTYPE_AK47: modelid = 355; case WEAPONTYPE_SNIPERRIFLE: modelid = 358; case WEAPONTYPE_CUNTGUN: modelid = 357; case WEAPONTYPE_DESERT_EAGLE: modelid = 348; case WEAPONTYPE_PISTOL_9MM: modelid = 346; case WEAPONTYPE_SILENCED_9MM: modelid = 347; case WEAPONTYPE_SPAS12: modelid = 351; case WEAPONTYPE_SHOTGUN: modelid = 349; case WEAPONTYPE_SAWN_OFF: modelid = 350; case WEAPONTYPE_MICRO_UZI: modelid = 352; case WEAPONTYPE_TEC9: modelid = 372; case WEAPONTYPE_MP5: modelid = 353; case WEAPONTYPE_GRENADE: modelid = 342; case WEAPONTYPE_MOLOTOW: modelid = 344; case WEAPONTYPE_RPG: modelid = 359; case WEAPONTYPE_SHOVEL: modelid = 337; case WEAPONTYPE_CHAINSAW: modelid = 341; case WEAPONTYPE_KATANA: modelid = 339; case WEAPONTYPE_BASEBALL: modelid = 336; case WEAPONTYPE_FLOWER: modelid = 325; case WEAPONTYPE_CANE: modelid = 326; case WEAPONTYPE_PARACHUTE: modelid = 371; case WEAPONTYPE_FIRE_EXTINGUSHER: modelid = 366; } WeaponPickups[PickupCounter[weapontype]][modelid][ammo] = CreateDynamicPickup(modelid,type,rx1,ry2,rz3,virtualworld); HeapSort(WeaponPickups); } }
Der Haken ist jedoch dass ich dann ein fettes Array brauche, am besten von der Groesse Pickups[MAX_PICKUPS][MAX_PICKUPS][MAX_PICKUPS], oder zumindest WeaponPickups[NUM_WEAPONS][NUM_WEAPONS][NUM_WEAPONS] wobei NUM_WEAPONS irgendwie bei 1000-5000 liegt
Ich koennte natuehrlich die Munition dann festlegen wenn der Spieler das Pickup einsammelt, aber dann spare ich gerade mal eine Dimension ein, und bin immernoch bei 2
-
1000 habe ich auch mal probiert, mag er leider auch nicht
Das ist viel zu viel.
Überleg mal, das entspricht alleine schon 1000*1000*1000 einzelnen Variablen, sprich 1.000.000.000 (eine Milliarde!) Variablen. Dass das den Compiler sprengt dürfte klar sein.
Bei 20000: 8.000.000.000.000 (8 Billionen!).WeaponPickups[PickupCounter[weapontype]][modelid][ammo]
Warum nimmst du überhaupt die modelid und die ammo ins Array? Das macht wenig Sinn.
Mache es doch so:
new pickupid = CreateDynamicPickup(modelid,type,rx1,ry2,rz3,virtualworld);
WeaponPickups[pickupid][wModel] = modelid;
WeaponPickups[pickupid][wAmmo] = ammo;wModel und wAmmo kommen dann aus dem enum zu WeaponPickups (gleich wie bei PlayerInfo).
-
Vielen Dank^^ Das Problem beruht bei mir scheinbar auf dem falschen Verstaendnis von Arrays
Habe mir das bisher immer wie ne Matrix vorgestelltHabe es dank des Beispiels geschafft
-
Nein, das ist falsch so.
Du musst die pickupid als ersten Index nehmen, nur diese ist eindeutig. Außerdem hast du einen sofortigen Zugriff, ohne Schleife.PickupCounter[weapontype] kann ja für jeden "weapontype" die gleichen Werte wieder annehmen, somit besteht keine Eindeutigkeit.
new pickupid = CreateDynamicPickup(modelid,type,rx1,ry2,rz3,virtualworld);
WeaponInfo[pickupid][wModel] = modelid;
WeaponInfo[pickupid][wAmmo] = random(1000)+10;Beim Pickup:
if(WeaponInfo[pickupid][wModel] != 0) GivePlayerWeapon(playerid, WeaponInfo[pickupid][wModel], WeaponInfo[pickupid][wAmmo]);Mehr ist es nicht.
-
Ich stell mich grad doof an (wieder)
dcmd_usedrugs(playerid,params[])
{
#pragma unused params
if(sSpieler[playerid][Drogen] == 0) return SendClientMessage(playerid,Weiß,"Du hast keine Drogen!");
if(sSpieler[playerid][Drogen] == 10) sSpieler[playerid][Drogen] = 9; SendClientMessage(playerid,Weiß,"Du hast 1g Drogen genommen und 10HP erhalten (9/10)"); GivePlayerHealth(playerid,10);
if(sSpieler[playerid][Drogen] == 9) sSpieler[playerid][Drogen] = 8; SendClientMessage(playerid,Weiß,"Du hast 1g Drogen genommen und 10HP erhalten (8/10)"); GivePlayerHealth(playerid,10);
if(sSpieler[playerid][Drogen] == 8) sSpieler[playerid][Drogen] = 7; SendClientMessage(playerid,Weiß,"Du hast 1g Drogen genommen und 10HP erhalten (7/10)"); GivePlayerHealth(playerid,10);
if(sSpieler[playerid][Drogen] == 7) sSpieler[playerid][Drogen] = 6; SendClientMessage(playerid,Weiß,"Du hast 1g Drogen genommen und 10HP erhalten (6/10)"); GivePlayerHealth(playerid,10);
if(sSpieler[playerid][Drogen] == 6) sSpieler[playerid][Drogen] = 5; SendClientMessage(playerid,Weiß,"Du hast 1g Drogen genommen und 10HP erhalten (5/10)"); GivePlayerHealth(playerid,10);
if(sSpieler[playerid][Drogen] == 5) sSpieler[playerid][Drogen] = 4; SendClientMessage(playerid,Weiß,"Du hast 1g Drogen genommen und 10HP erhalten (4/10)"); GivePlayerHealth(playerid,10);
if(sSpieler[playerid][Drogen] == 4) sSpieler[playerid][Drogen] = 3; SendClientMessage(playerid,Weiß,"Du hast 1g Drogen genommen und 10HP erhalten (3/10)"); GivePlayerHealth(playerid,10);
if(sSpieler[playerid][Drogen] == 3) sSpieler[playerid][Drogen] = 2; SendClientMessage(playerid,Weiß,"Du hast 1g Drogen genommen und 10HP erhalten (2/10)"); GivePlayerHealth(playerid,10);
if(sSpieler[playerid][Drogen] == 2) sSpieler[playerid][Drogen] = 1; SendClientMessage(playerid,Weiß,"Du hast 1g Drogen genommen und 10HP erhalten (1/10)"); GivePlayerHealth(playerid,10);
if(sSpieler[playerid][Drogen] == 1) sSpieler[playerid][Drogen] = 0; SendClientMessage(playerid,Weiß,"Du hast 1g Drogen genommen und 10HP erhalten (0/10)"); GivePlayerHealth(playerid,10);
return 1;
}habs mit einem tut ausm englischen forum versucht, nur leider gibt er mir mit else if nur fehler aus.
Der befehl funktioniert ansich, spammt aber alle abfragen nur durch. -
Du darfst hinter einem if nur eine direkte Anweisung haben, mit Semikolon:
if(sSpieler[playerid][Drogen] == 10) sSpieler[playerid][Drogen] = 9; SendClientMessage(playerid,Weiß,"Du hast 1g Drogen genommen und 10HP erhalten (9/10)"); GivePlayerHealth(playerid,10);Entweder (schlecht!):
if(sSpieler[playerid][Drogen] == 10) sSpieler[playerid][Drogen] = 9, SendClientMessage(playerid,Weiß,"Du hast 1g Drogen genommen und 10HP erhalten (9/10)"), GivePlayerHealth(playerid,10);Oder (gut!):
if(sSpieler[playerid][Drogen] == 10)
{
sSpieler[playerid][Drogen] = 9;
SendClientMessage(playerid,Weiß,"Du hast 1g Drogen genommen und 10HP erhalten (9/10)");
GivePlayerHealth(playerid,10);
}Oder am besten direkt so:
dcmd_usedrugs(playerid,params[])
{
#pragma unused params
if(sSpieler[playerid][Drogen] <= 0) return SendClientMessage(playerid,Weiß,"Du hast keine Drogen!");
sSpieler[playerid][Drogen]--;
new str[145];
format(str, sizeof(str), "Du hast 1g Drogen genommen und 10HP erhalten (%d/10)", sSpieler[playerid][Drogen]);
SendClientMessage(playerid,Weiß, str);
GivePlayerHealth(playerid,10);
return 1;
} -
Nein, das ist falsch so.
Du musst die pickupid als ersten Index nehmen, nur diese ist eindeutig. Außerdem hast du einen sofortigen Zugriff, ohne Schleife.PickupCounter[weapontype] kann ja für jeden "weapontype" die gleichen Werte wieder annehmen, somit besteht keine Eindeutigkeit.
new pickupid = CreateDynamicPickup(modelid,type,rx1,ry2,rz3,virtualworld);WeaponInfo[pickupid][wModel] = modelid;WeaponInfo[pickupid][wAmmo] = random(1000)+10;
Beim Pickup:
if(WeaponInfo[pickupid][wModel] != 0) GivePlayerWeapon(playerid, WeaponInfo[pickupid][wModel], WeaponInfo[pickupid][wAmmo]);Mehr ist es nicht.
Danke Jeffry Ich glaube ich bin zu kompliziert.
Musste das aufgrund meines komplexen Pickup Systems noch etwas umbauen.Das Problem mit der Eindeutigkeit habe ich auch erkannt.
So sieht mein Pickup Teil jetzt aus
C
Alles anzeigenpublic OnPlayerPickUpDynamicPickup(playerid, pickupid) { new index; switch(GetPickupType(pickupid,index)) { case INVALID_PICKUP_TYPE: { } case MONEY_TYPE: { PickupCounter[MONEY_TYPE] -= 1; GivePlayerMoney(playerid, MoneyVal); MoneyPickups[index]=-1; quickSort(MoneyPickups,0,sizeof(MoneyPickups)-1); DestroyDynamicPickup(pickupid); } case ACTOR_TYPE: { ShowMenuForPlayer(shopmenu,playerid); TogglePlayerControllable(playerid,false); } case INFO_TYPE: { ShowMenuForPlayer(infomenu,playerid); TogglePlayerControllable(playerid,false); } case WEAPONTYPE_M4..WEAPONTYPE_FIRE_EXTINGUSHER: { PickupCounter[GENERIC_WEAPON] -= 1; new weaponname; switch(WeaponInfo[pickupid][wModel])//Gibt nur die ModelID aus { case 356: weaponname = WEAPON_M4; case 355: weaponname = WEAPON_AK47; case 358: weaponname = WEAPON_SNIPER; case 357: weaponname = WEAPON_RIFLE; case 348: weaponname = WEAPON_DEAGLE; case 346: weaponname = WEAPON_COLT45; case 347: weaponname = WEAPON_SILENCED; case 351: weaponname = WEAPON_SHOTGSPA; case 349: weaponname = WEAPON_SHOTGUN; case 350: weaponname = WEAPON_SAWEDOFF; case 352: weaponname = WEAPON_UZI; case 372: weaponname = WEAPON_TEC9; case 353: weaponname = WEAPON_MP5; case 342: weaponname = WEAPON_GRENADE; case 344: weaponname = WEAPON_MOLTOV; case 359: weaponname = WEAPON_ROCKETLAUNCHER; case 337: weaponname = WEAPON_SHOVEL; case 341: weaponname = WEAPON_CHAINSAW; case 339: weaponname = WEAPON_KATANA; case 336: weaponname = WEAPON_BAT; case 325: weaponname = WEAPON_FLOWER; case 326: weaponname = WEAPON_CANE; case 371: weaponname = WEAPON_PARACHUTE; case 366: weaponname = WEAPON_FIREEXTINGUISHER; } GivePlayerWeapon(playerid, weaponname, WeaponInfo[pickupid][wAmmo]); WeaponPickups[index] = -1; HeapSort(WeaponPickups); DestroyDynamicPickup(pickupid); } } return 1; } stock GetPlayerNameID(playerid) { new name[MAX_PLAYER_NAME+24]; GetPlayerName(playerid,name,sizeof(name)); format(name,sizeof(name),"{%06x}%s (%d){FFFFFF}", GetPlayerColor(playerid) >>> 8,name,playerid); return name; } stock GetPickupType(pickupid, &index) { new mres = binarysearch(MoneyPickups,pickupid,0,sizeof(MoneyPickups)-1); if(mres > -1 && MoneyPickups[mres] == pickupid) return index=mres,MONEY_TYPE; new ares = binarysearch(ActorPickups,pickupid,0,sizeof(ActorPickups)-1); if(ares > -1 && ActorPickups[ares] == pickupid) return index=ares,ACTOR_TYPE; new ires = binarysearch(InfoPickups,pickupid,0,sizeof(InfoPickups)-1); if(ires > -1 && InfoPickups[ires] == pickupid) return index=ires,INFO_TYPE; new dres = binarysearch(WeaponPickups,pickupid,0,sizeof(WeaponPickups)-1); if(dres > -1 && WeaponPickups[dres] == pickupid) { switch(WeaponInfo[pickupid][wModel])//Gibt nur die ModelID aus { case 356: return index=dres,WEAPONTYPE_M4; case 355: return index=dres,WEAPONTYPE_AK47; case 358: return index=dres,WEAPONTYPE_SNIPERRIFLE; case 357: return index=dres,WEAPONTYPE_CUNTGUN; case 348: return index=dres,WEAPONTYPE_DESERT_EAGLE; case 346: return index=dres,WEAPONTYPE_PISTOL_9MM; case 347: return index=dres,WEAPONTYPE_SILENCED_9MM; case 351: return index=dres,WEAPONTYPE_SPAS12; case 349: return index=dres,WEAPONTYPE_SHOTGUN; case 350: return index=dres,WEAPONTYPE_SAWN_OFF; case 352: return index=dres,WEAPONTYPE_MICRO_UZI; case 372: return index=dres,WEAPONTYPE_TEC9; case 353: return index=dres,WEAPONTYPE_MP5; case 342: return index=dres,WEAPONTYPE_GRENADE; case 344: return index=dres,WEAPONTYPE_MOLOTOW; case 359: return index=dres,WEAPONTYPE_RPG; case 337: return index=dres,WEAPONTYPE_SHOVEL; case 341: return index=dres,WEAPONTYPE_CHAINSAW; case 339: return index=dres,WEAPONTYPE_KATANA; case 336: return index=dres,WEAPONTYPE_BASEBALL; case 325: return index=dres,WEAPONTYPE_FLOWER; case 326: return index=dres,WEAPONTYPE_CANE; case 371: return index=dres,WEAPONTYPE_PARACHUTE; case 366: return index=dres,WEAPONTYPE_FIRE_EXTINGUSHER; case 0: return INVALID_PICKUP_TYPE; } } return INVALID_PICKUP_TYPE; }
Wobei es hier vielleicht sinvoll waere, die ganzen Faelle nicht 1000 mal hinzuschreiben, sondern fuer die Waffen vielleicht case 5..20: bla bla weil die Waffentypen in einem enum definiert sind
C
Alles anzeigenstock GenerateRandomWeaponPickup(weapon,type,Float:x_max,Float:x_min,Float:y_max,Float:y_min,Float:z_max,Float:z_min,virtualworld) { if(PickupCounter[GENERIC_WEAPON] <= sizeof(WeaponPickups)) { new Float:rx1=((frandom((floatabs(x_max-x_min)))+x_min)); new Float:ry2=((frandom((floatabs(y_max-y_min)))+y_min)); new Float:rz3=((frandom((floatabs(z_max-z_min)))+z_min)); PickupCounter[GENERIC_WEAPON] = PickupCounter[GENERIC_WEAPON] +1; new modelid; switch(weapon) { case WEAPONTYPE_M4: modelid = 358; case WEAPONTYPE_AK47: modelid = 355; case WEAPONTYPE_SNIPERRIFLE: modelid = 358; case WEAPONTYPE_CUNTGUN: modelid = 357; case WEAPONTYPE_DESERT_EAGLE: modelid = 348; case WEAPONTYPE_PISTOL_9MM: modelid = 346; case WEAPONTYPE_SILENCED_9MM: modelid = 347; case WEAPONTYPE_SPAS12: modelid = 351; case WEAPONTYPE_SHOTGUN: modelid = 349; case WEAPONTYPE_SAWN_OFF: modelid = 350; case WEAPONTYPE_MICRO_UZI: modelid = 352; case WEAPONTYPE_TEC9: modelid = 372; case WEAPONTYPE_MP5: modelid = 353; case WEAPONTYPE_GRENADE: modelid = 342; case WEAPONTYPE_MOLOTOW: modelid = 344; case WEAPONTYPE_RPG: modelid = 359; case WEAPONTYPE_SHOVEL: modelid = 337; case WEAPONTYPE_CHAINSAW: modelid = 341; case WEAPONTYPE_KATANA: modelid = 339; case WEAPONTYPE_BASEBALL: modelid = 336; case WEAPONTYPE_FLOWER: modelid = 325; case WEAPONTYPE_CANE: modelid = 326; case WEAPONTYPE_PARACHUTE: modelid = 371; case WEAPONTYPE_FIRE_EXTINGUSHER: modelid = 366; } WeaponPickups[PickupCounter[GENERIC_WEAPON]] = CreateDynamicPickup(modelid,type,rx1,ry2,rz3,virtualworld); WeaponInfo[WeaponPickups[PickupCounter[GENERIC_WEAPON]]][wModel] = modelid; WeaponInfo[WeaponPickups[PickupCounter[GENERIC_WEAPON]]][wAmmo] = random(1000)+10; HeapSort(WeaponPickups); } }
Werde das erstmal so probieren PickupCounter[GENERIC_WEAPON] ist der Zaehler fuer die PickupsC
Alles anzeigenstock GenerateRandomPickup(modelid,type,Float:x_max,Float:x_min,Float:y_max,Float:y_min,Float:z_max,Float:z_min,virtualworld) { if(PickupCounter[MONEY_TYPE] <= sizeof(MoneyPickups)) { moneyval= moneyval+1000; new Float:rx1=((frandom((floatabs(x_max-x_min)))+x_min)); new Float:ry2=((frandom((floatabs(y_max-y_min)))+y_min)); new Float:rz3=((frandom((floatabs(z_max-z_min)))+z_min)); PickupCounter[MONEY_TYPE] = PickupCounter[MONEY_TYPE] +1; MoneyPickups[PickupCounter[MONEY_TYPE]] = CreateDynamicPickup(modelid,type,rx1,ry2,rz3,virtualworld); HeapSort(MoneyPickups); } }
C
Alles anzeigenpublic MONEY_MAIN()//MAIN { { new Float:Z; new Float:rx1=((frandom((floatabs(MAP_WORLDBOUNDS[0][0]-MAP_WORLDBOUNDS[0][1])))+MAP_WORLDBOUNDS[0][1])); new Float:ry2=((frandom((floatabs(MAP_WORLDBOUNDS[0][2]-MAP_WORLDBOUNDS[0][3])))+MAP_WORLDBOUNDS[0][3])); MapAndreas_FindZ_For2DCoord(rx1,ry2,Z); GenerateRandomPickup(1212,19,rx1,rx1+1,ry2,ry2+1,Z,Z+0.5,0); } { new Float:Z; new Float:rx1=((frandom((floatabs(MAP_WORLDBOUNDS[0][0]-MAP_WORLDBOUNDS[0][1])))+MAP_WORLDBOUNDS[0][1])); new Float:ry2=((frandom((floatabs(MAP_WORLDBOUNDS[0][2]-MAP_WORLDBOUNDS[0][3])))+MAP_WORLDBOUNDS[0][3])); MapAndreas_FindZ_For2DCoord(rx1,ry2,Z); new randWeap = random(VAL_PICKUPTYPES-INFO_TYPE)+INFO_TYPE+1; GenerateRandomWeaponPickup(randWeap,19,rx1,rx1+1,ry2,ry2+1,Z,Z+0.5,0); } }
Hat jemand Tipps fuer das umbauen der HeapSort Funktion damit ich sie mit multidimensionalen arrays nutzen kann ?:D
C
Alles anzeigenstock HeapSort (array [], n = sizeof (array)) { new i; for (i = n / 2; i > 0; --i) // Make heap SinkDown (array, i, n); for (i = n; i > 1; --i) { Swap (array [i - 1], array [0]); SinkDown (array, 1, i - 1); } } static stock SinkDown (array [], i, m) { new j; while (2 * i <= m) { j = 2 * i; if (j < m && array [j - 1] < array [j]) ++j; if (array [i - 1] < array [j - 1]) { Swap (array [i - 1], array [j - 1]); i = j; } else i = m; } } volatile static stock Swap (&a, &b) { new s; s = a; a = b; b = s; }
-
-
-
Vielen Dank!
Ich habe mir das mal angeschaut, bin aber nicht so ganz ueberzeugt von der performance weil irgendwie bei dem quickSort Algorithmus von Slice der Worst Case nicht ausgeschlossen wurde .
Habe deshalb versucht bei mir das Pivot Element aus dem Mittelwert von 2 Werten zu waehlen, um zu gewaehrleisten dass ich immer O(n log n) habeHabe das ganze nun gebaut bekommen, jedoch noch 1 Problem:
Bekomme irgendwie nicht selten als WeaponInfo[pickupid][wModel] Nullen als Werte, eventuell durch meinen fehlerhaften Umgang mit random?
Weiterhin sind die WeaponPickups da, funktionieren auch, jedoch bekomme ich z.B. wenn ich eine Katana einsammle, eine M4
Wo muss ich da nach dem Problem suchen? Vielleicht beim Sortieren?Bitte um Rat
OnPlayerPickUpPickUp und dazugehoerige Funktion
C
Alles anzeigenpublic OnPlayerPickUpDynamicPickup(playerid, pickupid) { new index; switch(GetPickupType(pickupid,index)) { case INVALID_PICKUP_TYPE: { } case MONEY_TYPE: { PickupCounter[MONEY_TYPE] -= 1; GivePlayerMoney(playerid, MoneyVal); MoneyPickups[index]=-1; quickSort(MoneyPickups,0,sizeof(MoneyPickups)-1); DestroyDynamicPickup(pickupid); } case ACTOR_TYPE: { ShowMenuForPlayer(shopmenu,playerid); TogglePlayerControllable(playerid,false); } case INFO_TYPE: { ShowMenuForPlayer(infomenu,playerid); TogglePlayerControllable(playerid,false); } case WEAPONTYPE_M4..WEAPONTYPE_FIRE_EXTINGUSHER: { printf("RECEIVED WEAPON"); printf("WEAPON: %d",WeaponInfo[pickupid][wModel]); printf("WEAPON: Pickupid: %d WeaponID %d Ammo: %d",pickupid,WeaponInfo[pickupid][wModel],WeaponInfo[pickupid][wAmmo]); PickupCounter[GENERIC_WEAPON] -= 1; new weaponname; switch(WeaponInfo[pickupid][wModel])//Gibt nur die ModelID aus { case 356: weaponname = WEAPON_M4; case 355: weaponname = WEAPON_AK47; case 358: weaponname = WEAPON_SNIPER; case 357: weaponname = WEAPON_RIFLE; case 348: weaponname = WEAPON_DEAGLE; case 346: weaponname = WEAPON_COLT45; case 347: weaponname = WEAPON_SILENCED; case 351: weaponname = WEAPON_SHOTGSPA; case 349: weaponname = WEAPON_SHOTGUN; case 350: weaponname = WEAPON_SAWEDOFF; case 352: weaponname = WEAPON_UZI; case 372: weaponname = WEAPON_TEC9; case 353: weaponname = WEAPON_MP5; case 342: weaponname = WEAPON_GRENADE; case 344: weaponname = WEAPON_MOLTOV; case 359: weaponname = WEAPON_ROCKETLAUNCHER; case 337: weaponname = WEAPON_SHOVEL; case 341: weaponname = WEAPON_CHAINSAW; case 339: weaponname = WEAPON_KATANA; case 336: weaponname = WEAPON_BAT; case 325: weaponname = WEAPON_FLOWER; case 326: weaponname = WEAPON_CANE; case 371: weaponname = WEAPON_PARACHUTE; case 366: weaponname = WEAPON_FIREEXTINGUISHER; } GivePlayerWeapon(playerid, weaponname, WeaponInfo[pickupid][wAmmo]); WeaponPickups[index] = -1; HeapSort(WeaponPickups); quickSort2(WeaponInfo,0,0,sizeof(WeaponInfo)-1); DestroyDynamicPickup(pickupid); } } return 1; } stock GetPickupType(pickupid, &index) { new mres = binarysearch(MoneyPickups,pickupid,0,sizeof(MoneyPickups)-1); if(mres > -1 && MoneyPickups[mres] == pickupid) return index=mres,MONEY_TYPE; new ares = binarysearch(ActorPickups,pickupid,0,sizeof(ActorPickups)-1); if(ares > -1 && ActorPickups[ares] == pickupid) return index=ares,ACTOR_TYPE; new ires = binarysearch(InfoPickups,pickupid,0,sizeof(InfoPickups)-1); if(ires > -1 && InfoPickups[ires] == pickupid) return index=ires,INFO_TYPE; new dres = binarysearch(WeaponPickups,pickupid,0,sizeof(WeaponPickups)-1); if(dres > -1 && WeaponPickups[dres] == pickupid) { switch(WeaponInfo[pickupid][wModel]) { case 356: return index=dres,WEAPONTYPE_M4; case 355: return index=dres,WEAPONTYPE_AK47; case 358: return index=dres,WEAPONTYPE_SNIPERRIFLE; case 357: return index=dres,WEAPONTYPE_CUNTGUN; case 348: return index=dres,WEAPONTYPE_DESERT_EAGLE; case 346: return index=dres,WEAPONTYPE_PISTOL_9MM; case 347: return index=dres,WEAPONTYPE_SILENCED_9MM; case 351: return index=dres,WEAPONTYPE_SPAS12; case 349: return index=dres,WEAPONTYPE_SHOTGUN; case 350: return index=dres,WEAPONTYPE_SAWN_OFF; case 352: return index=dres,WEAPONTYPE_MICRO_UZI; case 372: return index=dres,WEAPONTYPE_TEC9; case 353: return index=dres,WEAPONTYPE_MP5; case 342: return index=dres,WEAPONTYPE_GRENADE; case 344: return index=dres,WEAPONTYPE_MOLOTOW; case 359: return index=dres,WEAPONTYPE_RPG; case 337: return index=dres,WEAPONTYPE_SHOVEL; case 341: return index=dres,WEAPONTYPE_CHAINSAW; case 339: return index=dres,WEAPONTYPE_KATANA; case 336: return index=dres,WEAPONTYPE_BASEBALL; case 325: return index=dres,WEAPONTYPE_FLOWER; case 326: return index=dres,WEAPONTYPE_CANE; case 371: return index=dres,WEAPONTYPE_PARACHUTE; case 366: return index=dres,WEAPONTYPE_FIRE_EXTINGUSHER; case 0: return INVALID_PICKUP_TYPE; } } return INVALID_PICKUP_TYPE; }
C
Alles anzeigenstock quickSort2(array[][],idx, left, right) { new tempLeft = left, tempRight = right, pivot = array[(left + right) / 2][idx], tempVar ; while(tempLeft <= tempRight) { while(array[tempLeft][idx] < pivot) tempLeft++; while(array[tempRight][idx] > pivot) tempRight--; if(tempLeft <= tempRight) { tempVar = array[tempLeft][idx], array[tempLeft][idx] = array[tempRight][idx], array[tempRight][idx] = tempVar; tempLeft++, tempRight--; } } if(left < tempRight) quickSort(array[idx], left, tempRight); if(tempLeft < right) quickSort(array[idx], tempLeft, right); }
Jede 20ms wird eins generiert
C
Alles anzeigenpublic MONEY_MAIN()//MAIN { { new Float:Z; new Float:rx1=((frandom((floatabs(MAP_WORLDBOUNDS[0][0]-MAP_WORLDBOUNDS[0][1])))+MAP_WORLDBOUNDS[0][1])); new Float:ry2=((frandom((floatabs(MAP_WORLDBOUNDS[0][2]-MAP_WORLDBOUNDS[0][3])))+MAP_WORLDBOUNDS[0][3])); MapAndreas_FindZ_For2DCoord(rx1,ry2,Z); GenerateRandomPickup(1212,19,rx1,rx1+1,ry2,ry2+1,Z,Z+0.5,0); } { new Float:Z; new Float:rx1=((frandom((floatabs(MAP_WORLDBOUNDS[0][0]-MAP_WORLDBOUNDS[0][1])))+MAP_WORLDBOUNDS[0][1])); new Float:ry2=((frandom((floatabs(MAP_WORLDBOUNDS[0][2]-MAP_WORLDBOUNDS[0][3])))+MAP_WORLDBOUNDS[0][3])); MapAndreas_FindZ_For2DCoord(rx1,ry2,Z); new randWeap = random(VAL_PICKUPTYPES-INFO_TYPE)+INFO_TYPE+1; GenerateRandomWeaponPickup(randWeap,19,rx1,rx1+1,ry2,ry2+1,Z,Z+0.5,0); } }
Die Funktion dazu
C
Alles anzeigenstock GenerateRandomWeaponPickup(weapon,type,Float:x_max,Float:x_min,Float:y_max,Float:y_min,Float:z_max,Float:z_min,virtualworld) { if(PickupCounter[GENERIC_WEAPON] <= sizeof(WeaponPickups)) { new Float:rx1=((frandom((floatabs(x_max-x_min)))+x_min)); new Float:ry2=((frandom((floatabs(y_max-y_min)))+y_min)); new Float:rz3=((frandom((floatabs(z_max-z_min)))+z_min)); new modelid; switch(weapon) { case WEAPONTYPE_M4: modelid = 356; case WEAPONTYPE_AK47: modelid = 355; case WEAPONTYPE_SNIPERRIFLE: modelid = 358; case WEAPONTYPE_CUNTGUN: modelid = 357; case WEAPONTYPE_DESERT_EAGLE: modelid = 348; case WEAPONTYPE_PISTOL_9MM: modelid = 346; case WEAPONTYPE_SILENCED_9MM: modelid = 347; case WEAPONTYPE_SPAS12: modelid = 351; case WEAPONTYPE_SHOTGUN: modelid = 349; case WEAPONTYPE_SAWN_OFF: modelid = 350; case WEAPONTYPE_MICRO_UZI: modelid = 352; case WEAPONTYPE_TEC9: modelid = 372; case WEAPONTYPE_MP5: modelid = 353; case WEAPONTYPE_GRENADE: modelid = 342; case WEAPONTYPE_MOLOTOW: modelid = 344; case WEAPONTYPE_RPG: modelid = 359; case WEAPONTYPE_SHOVEL: modelid = 337; case WEAPONTYPE_CHAINSAW: modelid = 341; case WEAPONTYPE_KATANA: modelid = 339; case WEAPONTYPE_BASEBALL: modelid = 336; case WEAPONTYPE_FLOWER: modelid = 325; case WEAPONTYPE_CANE: modelid = 326; case WEAPONTYPE_PARACHUTE: modelid = 371; case WEAPONTYPE_FIRE_EXTINGUSHER: modelid = 366; } PickupCounter[GENERIC_WEAPON] = PickupCounter[GENERIC_WEAPON] +1; WeaponPickups[PickupCounter[GENERIC_WEAPON]] = CreateDynamicPickup(modelid,type,rx1,ry2,rz3,virtualworld); WeaponInfo[PickupCounter[GENERIC_WEAPON]][wModel] = modelid; WeaponInfo[PickupCounter[GENERIC_WEAPON]][wAmmo] = random(1000)+10; HeapSort(WeaponPickups); quickSort2(WeaponInfo,0,0,sizeof(WeaponInfo)-1); } }
Die dazugehoerigen enums
C
Alles anzeigenenum { INVALID_PICKUP_TYPE, MONEY_TYPE, ACTOR_TYPE, INFO_TYPE, GENERIC_WEAPON, WEAPONTYPE_M4, WEAPONTYPE_AK47, WEAPONTYPE_SNIPERRIFLE, WEAPONTYPE_CUNTGUN, WEAPONTYPE_DESERT_EAGLE, WEAPONTYPE_PISTOL_9MM, WEAPONTYPE_SILENCED_9MM, WEAPONTYPE_SPAS12, WEAPONTYPE_SHOTGUN, WEAPONTYPE_SAWN_OFF, WEAPONTYPE_MICRO_UZI, WEAPONTYPE_TEC9, WEAPONTYPE_MP5, WEAPONTYPE_GRENADE, WEAPONTYPE_MOLOTOW, WEAPONTYPE_RPG, WEAPONTYPE_SHOVEL, WEAPONTYPE_CHAINSAW, WEAPONTYPE_KATANA, WEAPONTYPE_BASEBALL, WEAPONTYPE_FLOWER, WEAPONTYPE_CANE, WEAPONTYPE_PARACHUTE, WEAPONTYPE_FIRE_EXTINGUSHER, VAL_PICKUPTYPES }; enum { wModel, wAmmo, VAL_INFO };
Die Arrays
Cnew ActorPickups[NUM_ACTORS]; #if !defined NUM_WEAPONS #error NUM_WEAPONS must be defined!!! #endif new WeaponPickups[NUM_WEAPONS]; new WeaponInfo[NUM_WEAPONS][VAL_INFO]; new InfoPickups[sizeof(PlayerInfoPickups)]; new MoneyPickups[MAX_PICKUPS-sizeof(ActorPickups)-sizeof(InfoPickups)-NUM_WEAPONS-1];
Die Zuweisung der Munition geht auch bisher gut.
Jedoch ist halt die Modelid des erstellen Pickups, nicht die Modelid des Pickups bei GetPickUpType, als wuerde da irgendwas durcheinander kommenHabe daher ueberlegt ob ich hier
Unter OnPlayerPickUpPickup
switch(WeaponInfo[pickupid][wModel])
{statt der pickupid den Index nehmen muss den ich aus der Binaersuche rauskriege
-
Weiterhin sind die WeaponPickups da, funktionieren auch, jedoch bekomme ich z.B. wenn ich eine Katana einsammle, eine M4
Du greifst beim OnPlayerPickUpDynamicPickup mit der pickupid auf das Array zu, dann mach das auch beim erstellen und lass diese Counter weg! Zum dritten mal!
WeaponPickups[PickupCounter[GENERIC_WEAPON]] = CreateDynamicPickup(modelid,type,rx1,ry2,rz3,virtualworld);
WeaponInfo[PickupCounter[GENERIC_WEAPON]][wModel] = modelid;
WeaponInfo[PickupCounter[GENERIC_WEAPON]][wAmmo] = random(1000)+10;
zu:
new pickupid = CreateDynamicPickup(modelid,type,rx1,ry2,rz3,virtualworld);
WeaponInfo[pickupid][wModel] = modelid;
WeaponInfo[pickupid][wAmmo] = random(1000)+10;Nochmal sage ich das nicht.
Zudem ist dein komplettes System so überkompliziert, da blickt man gar nicht mehr durch. Was sollen zum Beispiel die Sortierfunktionen für einen Zweck erfüllen?
Die binarysearch Funktionen in GetPickupType haben ebenfalls keinen Sinn, da dein Index immer 0 ist. Ich verstehe auch nicht was das bezwecken soll.Das System an sich kannst du eigentlich komplett in die Tonne treten (sorry, aber ist so) und neu schreiben. Das geht wesentlich einfacher.
-> Ein Array mit enum für die Pickups (enum: Model [Welche Waffe z.B.], Menge [für Geld und Ammo], Typ [ob Geldpickup(0), Waffenpickup(1), etc).
-> Index ist die pickupid
-> Eine Funktion, die die Model-ID zur Waffen-ID zurück gibt.
-> Random Funktion für Position und Waffen-ID.Und wenns ein Geld Pickup sein soll, dann kann das ins gleiche Array. Jede Pickup-ID gibt es schließlich nur einmal, da hast du schon eine Eindeutigkeit.
Mehr ist es nicht. Das kann man in 1 Stunde problemlos funktionsfähig schreiben.
Zudem:
Dieser Thread ist für kleine Fragen, nicht für elendslange Codes.
Erstelle bitte einen separaten Thread für weitere Fragen. -
Hey ich habe noch nie gelernt wie man bestimmte Koordinaten random verwendet, es wird mal Zeit für mich sowas zu verstehen.
Ein Beispiel:
Bei einem Beruf soll einer zufällig, von sagen wir mal 4 Checkpoints, ausgewählt werden und diese Koordinaten sind alle vorgegeben.
Wie binde ich das nun in nem Code ein? Es wird über ein Befehl ausgelöst und trotzdem global im Script verwendet.Koords:
X | Y | Z
1 | 2 | 3
3 | 2 | 1
2 | 1 | 3
3 | 1 | 2Bitte auch ein wenig mit Erklärung da ich sowas noch nicht gemacht habe!
-
Hey ich habe noch nie gelernt wie man bestimmte Koordinaten random verwendet, es wird mal Zeit für mich sowas zu verstehen.
Hier wird das beschrieben:
http://wiki.sa-mp.com/wiki/randomAnstatt SetPlayerPos erstellst du eben den Checkpoint.
-
Hier wird das beschrieben:http://wiki.sa-mp.com/wiki/random
Anstatt SetPlayerPos erstellst du eben den Checkpoint.
Was bedeuten da die [rand][1] und [rand][2]?
Rand kann ich mir vorstellen aber die 1 und 2 nicht.Ich würde jetzt, ohne zu wissen was es heißt, es so machen:
SetPlayerCheckpoint(playerid, checkpoint[rand][0], checkpoint[rand][0], checkpoint[rand][0]);
-
Die 0 steht für die X Position im Array, die 1 für Y, die 2 für Z und die 3 für die Rotation. Da du keine Rotation benötigst, kannst du die weg lassen.
SetPlayerCheckpoint(playerid, checkpoint[rand][0], checkpoint[rand][1], checkpoint[rand][2]);
-
Die 0 steht für die X Position im Array, die 1 für Y, die 2 für Z und die 3 für die Rotation. Da du keine Rotation benötigst, kannst du die weg lassen.
SetPlayerCheckpoint(playerid, checkpoint[rand][0], checkpoint[rand][1], checkpoint[rand][2]);
Vielen Dank ich bin echt froh, dass du hier in dem Forum unterwegs bist und so hilfsbereit bistDie Breadfish Admins sollten dir mal eine "Sonderabzeichen" geben. Ich kann mich nur mit Worten bei dir bedanken, wie super nett du hier den Leuten hilfst und dann noch so aktiv!
Mach weiter so
______________________________________________________________________________________________________________________________________________________________________________
Edit: Hey da wundert es mich nochmal wie ich dann z.B. in ner Funktion abrufe > IsPlayerInRangeOfPoint(playerid, Jede X, Jede Y, Jede Z) aus der Random funktion?
Oder muss ich das alles einzeln machen? Ich hab da 17 verschiedene Koordinaten für Checkpoints -
Oder muss ich das alles einzeln machen? Ich hab da 17 verschiedene Koordinaten für Checkpoints
Das kannst du mit einer Schleife durch das Array erreichen:
for(new i = 0; i < sizeof(checkpoint); i++)
{
if(IsPlayerInRangeOfPoint(playerid, 5.0, checkpoint[i][0], checkpoint[i][1], checkpoint[i][2]))
{
//Spieler in der Nähe von Checkpoint mit der ID "i"
printf("Spieler %d ist in der Nähe von Checkpoint %d.", playerid, i);
return 1;
}
}
//Spieler bei keinem Checkpoint
printf("Spieler %d ist bei keinem Checkpoint.", playerid);
return 1; -
Und wie würde ich das ganze mit z.B. mit globalen Codes machen?
Ich hab da "Hacker" Funktion als Beruf wo man ganz schnell einen Zahlen Code eingeben muss um Geld zu bekommen. Im moment sieht es so aus:
z1[playerid] = random(9)
z2[playerid] = random(9)z3[playerid] = random(9)
z4[playerid] = random(9)
z5[playerid] = random(9)
... das ganze bis z12
Und da es so ziemlich unschön aussieht und sehr viel Platz klaut und viel Mühe kostet, wie mach ich das besser?
Am Ende sollte es einen Code generieren der z.B. so ist:
%d%d%d%d - %d%d%d%d - %d%d%d%d
Und der Spieler muss das in einem Dialog eingeben. Wie würde ich das mit einem Zahlen & Buchstaben Mix machen?
-