Beiträge von Sub Royal

    Habe ich mal gemacht, die Errors sind leider immernoch die gleichen :/
    Warum muss das Array MAX_STR_LEN enthalten? Wird jeder char etwa einzeln da abgespeichert oder komplette Strings?

    Moin


    Aktuell bin ich daran ein Programm zu schreiben, um Zeilenduplikate in einer Textdatei zu finden, und zu eliminieren.


    Dabei erstelle ich ein Array mit [lines] Anzahl der Lines .
    Dann werden aus der Textdatei die Zeilen als String in das Array gesteckt.
    Das Array wird dann sortiert, und dann soll das Array durchgegangen werden, ob das k-te Element und das k+1-te Element unterschiedlich sind, und dann wird in eine Datei geprintet.


    Irgendwie verstehe ich aber die Probleme die der Compiler macht nicht, da ich ja letztendlich im Array Daten vom Typ char habe, aber laut Compiler diese scheinbar ints sind.
    Weiterhin bekomme ich immer die aussagekraeftige Meldung "Speicherzugriffsfehler"




    Hier mal mein Code, vielleicht weiss jemand ja weiter.


    Die Fehler



    Changelog





    Ich gruesse euch liebe Community,


    Hiermit praesentiere ich mein aktuelles Miniprojekt Last Bed Standing, basierend auf Grand Larceny!


    Motivation:



    Idee und Ziel dieses Projekts war es das Bedwars Minigame welches es auf vielen Minecraft Servern gibt in SA-MP und im SA-MP Stil nachzubauen (Bett sprengen statt abbauen etc..), und mal ein andere Art von Servern erstellen, denn man sieht ja leider nur noch Reallife.
    Weiterhin programmiere ich im Rahmen meines Studiums viel in C, und warum nicht mal bisschen ueben durch Programmieren in einer C aehnlichne Sprache? Daraus ist dieses Projekt in nun ca. 2 Wochen entstanden, und was geht schon ueber ein Selfmade?
    Desweiteren bin ich ein Fan von OpenSource Software, weshalb auch dieses Projekt hier fuer alle verfuegbar sein sollte.


    Letztlich ist das Projekt nur aus Spass, und etwas Uebung fuer das Studium entstanden, und wird in Zukunft noch geupdated.



    Aktuell befindet sich der Gamemode im Alpha Stadium und wird vorraussichtlich jede Woche geupdated.
    Wenn es eine fehlerfreie Version gibt wird unter die GNU Public License gestellt, damit jeder das Werk aendern, verbreiten kann usw. soll ja schliesslich etwas fuer alle sein ;)





    Das Fragment welches aus Grand Larceny ist, ist lediglich die Team bzw. Stadtauswahl, meiner Ansicht nach viel schoener als der Standardkram den man auf sovielen Servern sieht.


    Aktuell gibt es 3 Teams zur Auswahl aehnlich wie in Bedwars wo es zu Beginn auch eine Teamauswahl gibt.
    Team ROT befindet sich am Sherman Staudamm, westlich von El Castillo del Diablo, Team GRAU bei Area 51 und Team BLAU bei Verdant Meadows, dem Flughafen.


    Jedes Team verfuegt ueber einen Shop mit einem "Villager" bei welchem man Waffen, Armour , Skills und eine Bombe kaufen kann die noetig ist um ein feindliches Bett zu zerstoeren.
    Alle Teams haben nahe Ihrer Base irgendein Fahrzeug wie z.B. Panzer oder Seasparrow um sich besser vor Feinden verteidigen zu koennen.


    Jedes Team besitzt einen "Bronzespawner" bzw. da ich das ganze im GTA Stil machen wollte, einen Geldspawner, welcher random Geldpickups generiert, welche noetig sind um sich Waffen und andere Dinge zu kaufen.


    Ziel ist es das Bett des feindlichen Teams zu zerstoeren (wobei nach dem Zerstoeren eines Betts das jeweilige Team nicht mehr respawnen kann), und dann die restlichen Spieler zu eliminieren, und so das Spiel zu gewinnen, wie in Bedwars halt.
    Der Gamemode ist inzwischen im Vergleich zum Ursprungs Grand Larceny, nun mit insgesamt 2400 Zeilen ziemlich umfangreich.


    Das ganze habe ich inzwischen mit 4 Spielern insgesamt ausprobiert, und ein Spiel dauert durchschnittlich 10 Minuten.
    Der Spassfaktor ist trotz der Einfachheit des Gamemodes sehr gross!


    Der Gamemode ist komplett in ENGLISCH geschrieben um auch Spieler aus anderen Laendern anzusprechen.


    Aktuell laeuft das Script unter knogleinsi.de als SA-MP Server mit 32 Slots, und wird auch weiterhin dort laufen.


    Weiterhin sind aktuell 4 verschiene Maps spielbar, und man kann problemlos weitere erstellen, dazu einfach die Muster in pawno/includes anschauen.


    Features:




    Das Script besitzt rund 3100 Zeilen, und ist eigentlich komplett selbst geschrieben, bis auf Tipps anderer User.
    Der Teil aus Grand Larceny wurde grundlegend veraendert.


    Es ist moeglich selbst Maps zu erstellen, dazu kann man einfach das Muster aus dem Ordner /pawno/include auf Github ziehen.



    Einfach Koordinaten, Farben und Namen anpassen, und fertig!


    Teamsize ist die Anzahl an Teams (Werde ich in Teamcount oder aehnlich umbauen) und kann zwischen 2 und 6 gewaehlt werden.
    Genutzt wird eine Moeglichst effiziente Programmierweise, beispielsweise Binaersuche statt Iteratoren etc.
    Pickupsystem ist dank der Hilfe von Usern hier nun super erweiterbar und super effizient.


    Der Gamemode nutzt sscanf, jedoch keinen Command Generator, um strtok endlich komplett zu verdraengen.
    Das Stats System nutzt y_ini, und es werden wie im Minecraft Bedwars, zerstoerte Betten, Kills/Deaths getrackt, und zusaetzlich noch detonierte Bomben, welche man im Shop kaufen kann.


    Es gibt zwei neue Features in der Version 0.1b:


    Stealth:


    Man kann sich im Shop ein Stealth Paket kaufen, durch welches man auf der Map 60 Sekunden unsichtbar ist.


    Bomb:


    Eine Bombe kann im Shop erworben werden, diese kann irgendwo platziert werden, und dann aus bis zu 100 Metern Entfernung durch die "Y" Taste gesprengt werden.


    Eine Reihe Admin Commands wurde inzwischen implementiert.
    Weiterhin habe ich auch einige Maps aus meinem alten Projekt Hitoyoshi implementiert, damit diese noch Verwendung haben.


    Fuer die naechste Version welche Mittwoch erscheinen soll, ist die Implementierung von Incognitos Streamer geplant.


    Es gibt aktuell 3 Maps mit 4 Teams, und 1 Map mit 3 Teams


    ... weitere Features in neuer Version, siehe auch http://forum.sa-mp.com/showthread.php?p=3846056#post3846056





    Hier mal einen kleinen Ueberblick ueber die Teams, und deren Lage, auf eine der aktuell 4 Maps.



    Bilder:


    Eine Bombe wird an einem Bett platziert!




    Das Bett detoniert, und geht in Flammen auf!




    Die auf Grand Larceny basierende Teamauswahl





    Eins der 3 Teams die man auswaehlen kann.





    Der Shop des Teams ROT





    "Bronzespawner" und kleine Tafel die jedes Team besitzt, auf welcher Informationen zum Spiel angezeigt und aktualisiert werden.





    Die aus Bedwars bekannte "Mitte"





    Das Bett von Team GREY















    Download:


    Einfach das Repo klonen



    https://github.com/Knogle/LastBedStanding

    Den Englischen Thread den ich wesentlich haeufiger updaten werde verlinke ich hier


    http://forum.sa-mp.com/forumdisplay.php?f=71



    Moin


    Update ist draussen.


    Pickups werden nun mit Kalibers System verwaltet, inklusive Binaersuche, daher super erweiterbar, und verdammt schnell!
    Bugs wurden alle gefixxt (bekannte Bugs), und es wurden 2 zusaetzliche Maps hinzugefuegt.


    Weiterhin kann nun jeder seine eigenen Maps erstellen, dazu einfach das Muster aus dem pawno/include Ordner nehmen, und einfach Koordinaten und Farben ersetzen, fertig!
    Shop wurde erweitert, Commands fuer Admins hinzugefuegt, y_ini Stats System und mehr hinzugefuegt.


    Vollstaendiges changelog kommt die Tage auf github


    https://github.com/Knogle/LastBedStanding

    :D habe den Fehler dank dem englischen SAMP Forum gefunden X/:D


    C
    stock GetPickupType(pickupid, &index)
    {
    	new ares = binarysearch(ActorPickups,pickupid,0,sizeof(ActorPickups)-1);
    	if(ares > -1 && MoneyPickups[ares] == pickupid) return index=ares,ACTOR_TYPE;
    	new mres = binarysearch(MoneyPickups,pickupid,0,sizeof(MoneyPickups)-1);
    	if(mres > -1 && MoneyPickups[mres] == pickupid) return index=mres,MONEY_TYPE;
    	return INVALID_PICKUP_TYPE;
    }

    Habe faelschlicherweise auch unten MoneyPickups drin statt ActorPickups X( jetzt gehts einwandfrei

    Eventuell leere Indizes.Um Fehler mit der ID 0 zu vermeiden entweder alle Array-Indizes auf -1 setzen, oder ganz oben in OnGameModeInit ein Pickup im Nirgendwo erstellen, das hat dann die ID 0 und wird nie aufgerufen.



    Siehe Post #24.196.

    Danke dir, das hat mir schonmal geholfen die doppelten IDs zu verhindern :D
    Habe jedoch immernoch das Problem wenn:


    Den Teil aus Post #24.196 habe ich auch eingebaut.


    Ich das hier habe


    C
    stock GetPickupType(pickupid, &index)
        {
        	new mres = binarysearch(MoneyPickups,pickupid,0,sizeof(MoneyPickups)-1);
        	if(MoneyPickups[mres] == pickupid && mres > -1) return index=mres,MONEY_TYPE;
        	new ares = binarysearch(ActorPickups,pickupid,0,sizeof(ActorPickups)-1);
        	if(ActorPickups[ares] == pickupid && ares > -1) return index=ares,ACTOR_TYPE;	
        	return INVALID_PICKUP_TYPE;
        }


    Und dann ein ActorPickup einsammle, dann wird INVALID_PICKUP_TYPE returnt, weshalb weiss ich nicht.
    Wenn ich ein MoneyPickup einsammle ist alles gut, dann funktioniert alles so wie es soll.
    Ist alles umgedreht, also der Teil mit den ActorPickups oben, funktionieren die ActorPickups super, sammle ich jedoch ein MoneyPickup ein wird INVALID_PICKUP_TYPE returnt.


    So als wuerde es mir scheinen dass nach dem ersten if statement der direkt dannach zu return INVALID_PICKUP_TYPE geht.


    Aktuell benutze ich den Teil von Kaliber der prima funkt mit den beiden for Schleifen, mit der Suche waere aber die Kroenung :D



    Sind Queues eigentlich moeglich in PAWN?

    Nein, das bedeutet dass du in beiden Arrays die selben IDs hast xD


    Irgendwas stimmt da mit deiner Zuweisung nicht ^^


    Aber wie gesagt, eigentlich musst du Money pickups nicht extra definieren nur alle anderen ^^

    Ja das probiere ich mal :D
    Mit der Zuweisugn hmm, habe da nix gefunden
    Habe mal die Inhalte von dem kleineren Array im grossen gesucht, und das einzige wo es immer ein match gibt, ist bei Pickupid 0, die ist in beiden drin, keine Ahnung warum
    Alle anderen sind nicht in den jeweils anderem Array enthalten

    Ich muss leider nochmal stoeren :D



    C
    stock GetPickupType(pickupid, &index)
    {
    	new ares = binarysearch(ActorPickups,pickupid,0,sizeof(ActorPickups)-1);
    	if(ActorPickups[ares] == pickupid && ares > -1) return index=ares,ACTOR_TYPE;	
    	new mres = binarysearch(MoneyPickups,pickupid,0,sizeof(MoneyPickups)-1);
    	if(MoneyPickups[mres] == pickupid && mres > -1) return index=mres,MONEY_TYPE;
    	return INVALID_PICKUP_TYPE;
    }


    Wenn ich das so schreibe, dann funktioniert das ganze nur fuer die Actor Pickups, das heisst beim Geld einsammeln kriegt der Spieler kein Geld


    C
    stock GetPickupType(pickupid, &index)
    {
    	new mres = binarysearch(MoneyPickups,pickupid,0,sizeof(MoneyPickups)-1);
    	if(MoneyPickups[mres] == pickupid && mres > -1) return index=mres,MONEY_TYPE;
    	new ares = binarysearch(ActorPickups,pickupid,0,sizeof(ActorPickups)-1);
    	if(ActorPickups[ares] == pickupid && ares > -1) return index=ares,ACTOR_TYPE;	
    	return INVALID_PICKUP_TYPE;
    }

    Wenn ich das so rum mache ist das genau umgedreht :D Money Pickups funktionieren, das heisst der Spieler kriegt Geld, jedoch funktionieren die ActorPickups nicht ?(
    Kann ich das irgendwie mit nem if-else Gebilde loesen ? :D

    Danke dir ! :D warum funktioniert deine binaersuche , jedoch meine nicht? :D Habe ich da was falsch gemacht?


    Super dann werde ich mal folgendes einbauen :D



    C
    new ares = binsearch(pickupid,ActorPickups,sizeof(ActorPickups));
    		if(ares != -1) return index=ares,ACTOR_TYPE;
    		printf("ID: %d ares: %d",pickupid,ares);
    		new mres = binsearch(pickupid,MoneyPickups,sizeof(MoneyPickups));
    		if(mres != -1) return index=mres,MONEY_TYPE;
    		printf("ID: %d mres: %d",pickupid,mres);

    Vielen Dank nochmal! Zu Binaersuche im PAWN konnte mir leider im englischen Forum nicht geholfen werden

    Nein der letzte Eintrag ist -1.
    Die Frage ist nur was er genau vorhat, will er wirklich nur den letzten Wert(so wie es für mich klingt) oder will er den letzten Wert der nicht dem Standardwert entspricht(deine Schleife).

    Ja ich wollte nur den wirklich letzten Wert :D


    Noch ne Frage
    Meine binary suche ist irgendwie kaputt :D returnt immer 0,kA warum, hat jemand eventuell zufaellig ne binaersuch Funktion auf Lager?


    Oder muss ich l un r eventuell anders festlegen?


    Der fragliche Teil:


    Code
    new mres = binsearch(MoneyPickups,pickupid,MoneyPickups[0],MoneyPickups[sizeof(MoneyPickups)-1]);
            if(MoneyPickups[mres] == pickupid) return index=mres,MONEY_TYPE;
            printf("ID:%d mres: %d",pickupid,mres);


    Es kommt immer zu return 0 aus meiner binsearch funktion



    Habe als l das erste Element genommen also das am weitesten Links ist MoneyPickups[0] und das am weitesten rechts ist MoneyPickups[sizeof(MoneyPickups)-1]

    Dickes Lob an Kaliber :thumbup: seine Tipps waren bisher ausnahmslos erfolgreich, bin dafuer sehr dankbar.
    Gab viele knifflige Probleme an denen ich ohne Kaliber wohl immernoch nagen wuerde :D

    Danke Kaliber: :D


    So jetzt kommt meine vielleicht fuer heute letzte Frage :D


    Ich werde tatsaechlich spaeter noch mehr Pickups hinzufuegen, deshalb habe ich das mit dem sortieren mal gemacht.


    Bei dem Array mit den Actors ist das kein Problem, da aendert sich ja nix dran, und es funktioniert auch


    C
    stock GetPickupType(pickupid, &index)
    {
    		new mres = binsearch(MoneyPickups,pickupid,0,sizeof(MoneyPickups)-1);
    HeapSort(MoneyPickups);
    		if(MoneyPickups[mres] == pickupid) return index=mres,MONEY_TYPE;
    		new ares = binsearch(ActorPickups,pickupid,0,sizeof(ActorPickups)-1);
    		if(ActorPickups[ares] == pickupid) return index=ares,ACTOR_TYPE;
    	return INVALID_PICKUP_TYPE;
    }

    Mal angenommen ich will das Array sortieren damit das mit der binaersuche klappt, wo muesste ich das Sortieren dann ausfuehren also wo im Code? :D
    Habe dazu eine super tolle HeapSort Funktion


    Wow klasse das funktioniert alles 1A :D jetzt funktioniert mein Gamemode endlich und ich kann endlich die neue Version veroeffentlichen :D
    Die enum Variante ist wirklich klasse!


    Mir ist jedoch aufgefallen, da mein Skript jetzt mit Makros vollgeballert wurde, bestimmt 600-700 Zeilen mit einem # inzwischen :D dauert das Compilen leider ziemlich lange!


    Noch ne Frage zu dem OnPlayerPickUpPickup


    Da wird ja letztendlich in dem Array gesucht wie ich das sehe, das kann ja bei 4000 MoneyPickups beispielsweise ziemlich lange dauern.
    Damit es keinen Ueberlauf an Pickups gibt (ueber 4096) habe ich die so definiert, ist das richtig?

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


    Ist es eventuell weiterhin sinvoll oder moeglich, bei GetPickupType die binaere Suche anzuwenden? Zumindest hat sie ja eine geringere Laufzeit
    Habe da an sowas gedacht was ich mal aus nem C Buch entnommen, und umgebaut habe



    Habe mir eventuell folgendes gedacht



    //edit: vergiss meinen Code der ist mist :D

    Danke dir, leider haut das auch irgendwie nicht hin:/


    Nochmal alle Teile.


    Auf den Counter via Globale Variable habe ich verzichtet da ich das in einer for schleife eh mit Iterator mache (oder ist das mein Fehler? :D)


    Nochmal die Actor Funktion wo das PickUp generiert wird



    Wo es aufgesammelt wird



    Und der Funktionsaufruf


    C
    for(new g=0;g<sizeof(GlobalActors);g++)
    	{
    		CreateGlobalActor(g+1,274,GlobalActors[g][0],GlobalActors[g][1],GlobalActors[g][2],GlobalActors[g][3],3.0,ActorPickups[g]);		
    		SetActorInvulnerable(g+1, true);
    	}

    Wenn ich alles richtig verstanden habe, muesste die Pickupid, beispielsweise bei der ersten Iteration bei g= 0 ActorPickups[0] uebergeben werden, und dann ActorPickups[0] = CreatePickup dann ausgefuehrt werden, oder?
    Oder kann man keiene Werte aus Arrays in einer Funktion uebergeben?




    Weitere Frage:


    Ich habe einen Command mit dem ein Spieler unsichtbar wird, und setze dann einen Timer von 60 Sekunden um ihn wieder sichtbar zu machen.
    Problem ist: Ueber einen Timer kann ich ja keine Parameter an die Funktion uebergeben, wie kriege ich das dann realisiert? Muss ich vielleicht mit dem & Symbol arbeiten? Weil irgendwie muss die Funktion ja wissen bei welchem Spieler die 60 Sekunden abgelaufen sind.


    Macht es ausserdem irgendwo sinn in PAWN volatile einzusetzen? Ich habe mal in meine Arrays testweise volatile reingepackt, sehe aber keinen Unterschied.
    Auch in der Dokumentation zu PAWN habe ich nix zu volatile gefunden, kenne das nur aus C daher weiss ich nicht was es in PAWN bringen sollte

    Kaliber:


    Habe es mit der Pickupzuweisung so wie in deinem Vorschlag gemacht :D



    Habe jedoch ein kleines Problem:



    Ich versuche gerade irgendwie hinzukriegen, dass der else Teil ausgefuehrt wird, wenn das aufgesammelte Pickup keine Pickupid aus ActorPickups, aber natuehrlich klappt das nicht verneunftig.


    Wie kann ich realisieren, dass else erst ausgefuehrt wird, wenn die For schleife durch ist, und die Bedingung darin nicht erfuellt ist?

    Mit der Pickup Array Sache habe ich irgendwie immernoch ein Problem: /


    Hier weise ich dem Pickup die ID zu


    C
    for(new g=0;g<sizeof(GlobalActors);g++)
    	{
    		CreateGlobalActor(g+1,274,GlobalActors[g][0],GlobalActors[g][1],GlobalActors[g][2],GlobalActors[g][3],3.0,ActorPickups[g]);		
    		SetActorInvulnerable(g+1, true);
    	}


    Dazugehoerige Funktion



    printf gibt immer aus dass die Pickupids 1, 2,3,4,5 sind, bei einer sizeof(GlobalActors) von 5, egal was ich als pickupid in die Funktion gebe


    Daher war auch der Teil mit OnPlayerPickUpPickup irgendwie nicht funktionsfaehig


    C
    for(new i;i<sizeof(ActorPickups);i++)
    {
    if(pickupid == ActorPickups[i])
    		{
    			ShowMenuForPlayer(shopmenu,playerid);
    			TogglePlayerControllable(playerid,false);
    		}
    }

    Habe ich wieder einen Fehler drin? :D