Beiträge von Sub Royal

    Chillige Idee. Muss man auch mal drauf kommen.
    Mir gefällt es :) kann man es testen?

    Ja schreib mir ne PN dann zeig ichs dir


    Also wenn jemand testen will, einfach ne PN schreiben, dann versuch ich paar zusammen zu trommeln


    Update:




    Rekursive Implementierung war nun erfolgreich!


    Neuste Version verfuegbar im GitHub Repo:


    https://github.com/Knogle/LastBedStanding


    //edit: Thread wird nurnoch im englischen SA-MP Forum fortgesetzt.

    Ich gruesse euch liebe Community,
    Ich habe aktuell folgendes probiert:


    Habe mir einen Multithreadtauglichen Mergesort Algorithmus gebaut, und einen normalen Heapsort Algorithmus.
    Das Problem ist nun folgendes:


    Ich erstelle bei beiden ein Random Array mit einer Groesse von z.B. 10000.
    Ab dem Zeitpunkt wird die Zeit vom Sortiervorgang gemessen, sowohl bei Mergesort als auch Heapsort.
    Sind beides unabhaengige ausfuehrbare Dateien.


    Das Problem ist: Mergesort braucht trotz Multicore Optimierung 4 mal solange wie mein Heapsort Algorithmus.
    Woran kann das liegen?


    Einmal Mergesort



    Ist es eventuell falsch implementiert?


    Verfuegbar sind 24 Threads beim System

    Wie kann ich einen AudioStream abspielen den ich vom lokalen Server beziehe, also keine remote Adresse?


    Wie muss da meine PlayAudioStreamForPlayer Zeile aussehen, wenn die entsprechende Audio Datei beispielsweise im gleichen Ordner liegt wie der Server?

    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) habe



    Habe 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 :D
    Wo muss ich da nach dem Problem suchen? Vielleicht beim Sortieren?


    Bitte um Rat



    OnPlayerPickUpPickUp und dazugehoerige Funktion










    Jede 20ms wird eins generiert








    Die Funktion dazu


    Die dazugehoerigen enums



    Die Arrays

    C
    new 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 kommen


    Habe daher ueberlegt ob ich hier



    Unter OnPlayerPickUpPickup


    switch(WeaponInfo[pickupid][wModel])
    {


    statt der pickupid den Index nehmen muss den ich aus der Binaersuche rauskriege

    Danke Jeffry :D 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






    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


    Werde das erstmal so probieren :D PickupCounter[GENERIC_WEAPON] ist der Zaehler fuer die Pickups



    Hat jemand Tipps fuer das umbauen der HeapSort Funktion damit ich sie mit multidimensionalen arrays nutzen kann ?:D


    Vielen Dank^^ Das Problem beruht bei mir scheinbar auf dem falschen Verstaendnis von Arrays :D
    Habe mir das bisher immer wie ne Matrix vorgestellt



    Habe es dank des Beispiels geschafft


    C
    WeaponPickups[PickupCounter[weapontype]] = CreateDynamicPickup(modelid,type,rx1,ry2,rz3,virtualworld);
    		WeaponInfo[WeaponPickups[PickupCounter[weapontype]]][wModel] = modelid;
    		WeaponInfo[WeaponPickups[PickupCounter[weapontype]]][wAmmo] = random(1000)+10;

    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




    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

    Warum bringt das hier den Compiler zu crashen? :D




    C
    new 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

    Moin ein grosses Problem^^


    Habe mein Pickupsystem


    Folgende Pickuptypen definiert







    C
    #define NUM_ACTORS 200
    #define NUM_WEAPONS 5000
    
    
    new ActorPickups[NUM_ACTORS];
    new WeaponPickups[NUM_WEAPONS];
    new InfoPickups[sizeof(PlayerInfoPickups)];
    new MoneyPickups[MAX_PICKUPS-sizeof(ActorPickups)-sizeof(InfoPickups)-sizeof(WeaponPickups)-1];


    1 Funktion um Random Weapon Pickups zu erstellen, und eine um Random Geldpickups zu erstellen ( letzteres funktioniert aktuell problemlos)




    Hier wird jede 20ms ein Pickup generiert von beiden Typen, eine Random Waffe.


    Meine OnPlayerPickUp Callback



    Problem ist jetzt: Wie weiss ich welchen Weapontyp bzw. Pickuptyp ich genau habe? Ich speicher ja unabhaengig vom Waffentyp, (WEAPONTYPE_M4, WEAPONTYPE_AK47)... alles in einem Array WeaponPickups mit Index PickupCounter (damit max. NUM_WEAPONS Pickups generiert werden)


    Wie kann ich jetzt einen Weg finden, wenn der Spieler ein Pickup mit Pickup ID aus dem Array WeaponPickups aufsammelt, der entsprechende Waffentyp noch bei rauskommt?
    Brauche ich dazu noch ein extra Array?



    Hier der Teil wo ich nicht weiter weiss wie ich das loesen kann, markiert mit Fragezeichen



    Ich will halt umgehen fuer jede Waffe ein einzelnes Array machen zu muessen


    Oder ist vielleicht ein multidimensionales Array sinnvoll, indem ich Pickuptyp und ID speichere und eventuell noch Munition die der Spieler bekommen soll beim aufsammeln?

    Schonmal vielen Dank dafuer :D


    Habe jetzt mein enum was ich noch auf ca. 40 Elemente ausdehnen werde


    C
    enum PickupTypes
    {
    	INVALID_PICKUP_TYPE,
    	MONEY_TYPE,
    	ACTOR_TYPE,
    	INFO_TYPE,
    	WEAPONTYPE_M4
    };


    Jedoch das Problem dass ich nun tag mismatchs bekomme wo ich die Inhalte wie MONEY_TYPE vorher eingesetzt habe




    C
    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;

    Ist es weiterhin einfacher moeglich zu verhindern dass die MAX_PICKUPS Grenze nicht ueberschritten wird?


    Aktuell habe ich dieses komische Konstrukt hier


    C
    new ActorPickups[sizeof(GlobalActors)];
    new InfoPickups[sizeof(PlayerInfoPickups)];
    new MoneyPickups[MAX_PICKUPS-sizeof(ActorPickups)-sizeof(InfoPickups)-1];

    Gibt es die Moeglichkeit die Anzahl der Elemente in einem enum zu bestimmen?


    Ich muss ein Array erstellen als Zaehler fuer erstellte Pickups, und habe in einem enum die Pickuptypen.
    Dann will ich das Array CreatedPickups[Anzahl der Elemente aus dem enum] mit Index den entsprechenden Pickuptyp aus dem enum haben.


    Gibts da irgendwelche Tricks?

    Super :D
    Das heisst ich kann statt das hier


    #define COLOR_TEAM_ONE 0x8B451355 //Brown




    #define COLOR_TEAM_ONE_STEALTH 0x8B451300 //Brown


    Das hier machen?


    #define COLOR_TEAM_ONE 0x8B451355 //Brown



    #define COLOR_TEAM_ONE_STEALTH getInv(COLOR_TEAM_ONE) (((COLOR_TEAM_ONE)>>8)<<8) //Brown

    Vielen Dank :D Auch wenn ich das Shiften irgendwie nie raffe mit mehreren >>>, vorallem nicht bei Hex :D


    Habe es jetzt so


    C
    stock SetPlayerInvisible(playerid)
    {
    	new hexstring[32];
    	new hex = GetPlayerColor(playerid);
    	format(hexstring,sizeof(hexstring),"0x%08x",(hex>>8)<<8 );
    	sscanf(hexstring, "x", hex);
    	SetPlayerColor(playerid,hex);
    }

    Danke Kali, finde deine Posts immer wieder super :D



    Habe eine Frage:


    Kann ich eine Hexzahl so shiften, dass ich am Ende immer 00 rauskriege? Also von 0xFF00FFAA zu 0xFF00FF00 ?


    Habe aktuell folgendes


    C
    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;
    }

    Wuerde aber gerne eine Funktion machen, mit der ich die Spielerfarbe des Spielers nehmen kann, und dann setzen, jedoch mit 00 am Ende, also unsichtbar auf der Minimap

    Habe aktuell eine kleine Funktion geschrieben.


    Diese soll einfach 2 beliebige Spieler auf dem Server tauschen, also die Positionen beider Spieler tauschen.


    Kann ich das ganze noch optimieren?
    Ich habe leider nur diesen Ansatz bisher hingekriegt


    Oder die haessliche Variante ohne goto