Beiträge von CHXRaupy

    Die wird doch direkt in die Funktion mit übergeben.

    Also window_type und slotindex sind zsm TITemPos:MonkaBinoculars:


    Bitte melden Sie sich an, um diesen Anhang zu sehen.


    Bitte melden Sie sich an, um diesen Anhang zu sehen.

    Ich würde dir empfehlen für sowas Official Clip Masking [Reversed] von blackdragon zu nutzen.

    Nutze es mittlerweile auch in allen meinen Systemen und es ist super praktisch und übersichtlich.

    Du musst auf das Element das clippen soll einfach nur das Targetwindow setzen. Ist immer nur 1 Zeile in Python und clipped auch direkt alle Childs des Elements mit.


    Bitte melden Sie sich an, um diesen Anhang zu sehen.

    Kein Ding, was genau meinst du mit "über Packets machen" ?

    Eine EventFunc ist ja kein Networking. Du kannst Packets daraus an deinen Char senden um z.b. dann die UI clientside zu aktualisieren, aber die EventFunc brauchst du ja trotzdem weil du Code in bestimmten Zeitintervallen ausführen willst.

    Ich würde ein eigenes Event für Playtime auf den PC Charactern erstellen, das in deinem gewünschten Zeitintervall die Playtime updated und auch deinen Rewardcode ausführt, wenn es dir wirklich so wichtig ist, dass es schneller geupdated und auf Reward gecheckt wird.


    Performancemäßig ist es natürlich ein Mehraufwand für jeden Char, aber ich sag mal so es gibt z.b. auch das Speedhack Check Event, das auf jedem Char liegt und jede Minute auf Speedhack checkt.

    Du könntest das Event sogar für deine Zwecke "missbrauchen" und dort auch deine Playtime und Rewards updaten, wenn du kein neues Event erstellen wolltest und mit den 60 Sekunden zufrieden wärst.


    Ansonsten machst du dir ein ordentliches eigenes Event für Playtime und Rewards und kannst dich dabei auch am Speedhack Event orientieren, weil es sich eigentlich 1zu1 so verhält wie du es brauchst, nur das es auf Speedhack checkt anstatt die Playtime und Rewards zu updaten.


    Du suchst am besten nach

    Code
    1. check_speedhack_event
    Code
    1. m_pkCheckSpeedHackEvent

    Dann solltest du gut überschauen können wie es funktioniert und dein eigenes Event daraus ableiten und schreiben können.

    Lad am besten noch deine chr also PythonCharacterModule.cpp hoch, vielleicht ist dort etwas falsch bei den Module Funktionen oder Konstanten, weil das ist das erste was er in introselect tut, also sich die zu holen. (Ist dort auch doppelt importiert kannst einen löschen)

    Also es sind keine Spieler mehr im Dungeon, das dead event wird created und nach 10 Sekunden ausgeführt und daraufhin die Private Map destroyed. Das sieht ja gut aus.


    Was mich aber stutzig macht ist der FPurgeStones Operator der daoben ausgeführt wird. Das ergibt keinen Sinn warum der ausgeführt werden soll, weil sowieso alle Entities auch Stones zu diesem Zeitpunkt gerade ordentlich destroyed wurden.


    Ich würde sagen FPurgeStones ist für den Crash verantworlich, weil es wahrscheinlich versucht einen Stone zu purgen und dann zu destroyen der bereits destroyed wurde.

    Also der character den PurgeStones destroyen will ist dann ein Dangling Pointer und deshalb crasht er im char Destruktor als er ein event von dem char clearen wollte und deshalb passiert der crash auch so sporadisch.


    Am besten guckst du mal ganz genau was in den Zeilen passiert und warum und wann FPurgeStones aufgerufen wird ich kann das nicht vergleichen weil ich das alles anders geschrieben habe, aber ich glaube nicht das die Funktion bei dir dort ausgeführt werden sollte.


    Also bei mir destroye ich die Private Map (was alle Entities und Items destroyed), dann den Dungeon (was alle Dungeon internen events und regens cleared) und dann ist Schluss.


    Bitte melden Sie sich an, um diesen Anhang zu sehen.


    Bitte melden Sie sich an, um diesen Anhang zu sehen.

    Gerne, ja das hatte den Grund, dass die InstanceBase Funktion ja sowieso schon eine Instanz von Python Background aufgerufen hat, da hat es sich angeboten den funktionalen Teil auch dorthin zu verfrachten, damit TestActorCollision sie auch verwenden kann, und eventuelle zukünftige Szenarios auch.

    Denn jetzt kannst du auf SafeZone checken wenn du nur die ActorInstance hast:

    Code
    1. CPythonBackground::Instance().IsActorInSafe(actor)

    Aber auch nach wie vor wenn du nur die InstanceBase instance hast:

    Code
    1. instanceBase->IsInSafe()

    ohne doppelten funktionalen Code zu haben.


    Außerdem musst du dich nicht jetzt und zukünftig um jeden TestActorCollision Aufruf und dessen Funktionsparameter kümmern, wie es bei den anderen Varianten der Fall gewesen wäre. Die Änderung war einmalig und bringt dir für die Zukunft mehr Handlungsspielraum.

    Kein Problem, ich zeig dir mal als Beispiel wie ich es in dem Fall machen würde.

    Ich würde die Funktion IsInSafe aus InstanceBase nach PythonBackground verlagern.

    So hast du den Code auch nicht mehr doppelt.


    Also deine InstanceBase Funktion IsInSafe wird jetzt zu:

    Code
    1. bool CInstanceBase::IsInSafe()
    2. {
    3. return CPythonBackground::Instance().IsActorInSafe(m_GraphicThingInstance);
    4. }


    In PythonBackground.h fügst du hinzu:

    Code
    1. public:
    2. bool IsActorInSafe(CActorInstance& actor);


    In PythonBackground.cpp fügst du hinzu:

    Code
    1. bool CPythonBackground::IsActorInSafe(CActorInstance& actor)
    2. {
    3. const auto& c_rkPPosCur = actor.NEW_GetCurPixelPositionRef();
    4. return isAttrOn(c_rkPPosCur.x, c_rkPPosCur.y, CTerrainImpl::ATTRIBUTE_BANPK);
    5. }


    Und in TestActorCollision() fügst du hinzu:

    Code
    1. if (CPythonBackground::instance().IsActorInSafe(rVictim))
    2. return FALSE;


    So hast du den funktionalen Teil des Codes an einer Stelle und kannst von überall drauf zugreifen sofern du die ActorInstance hast.


    Bitte melden Sie sich an, um diesen Link zu sehen.

    Du musst schon sagen welche InstanceBase du willst. Es gibt ja nicht nur eine, jede Entity hat eine.

    In deinem Fall willst du die InstanceBase von der ActorInstance (victim) die du in TestActorCollision übergibst.


    Da du bei jedem Aufruf von TestActorCollision auch den InstanceBase Pointer hast könntest du den mit in TestActorCollision übergeben und dann dort über den Pointer checken.


    Du könntest auch bei jedem Aufruf von TestActorCollision in InstanceBaseBattle direkt dort über den InstanceBase Pointer auf Safezone checken. (außerhalb von TestActorCollision )


    Du könntest sogar die Funktion IsInSafe fast komplett aus InstanceBase kopieren und in CActorInstance einfügen und ihr die ActorInstance vom victim aus TestActorCollision übergeben und die als m_GraphicThingInstance nehmen.


    Und noch viel mehr, hoffe das verdeutlicht das Prinzip.

    Very cool idea especially directly with the CRCs, it makes everything look so much better, makes me want to move from Shinsoo to Chunjo and get old there

    Bitte melden Sie sich an, um diesen Anhang zu sehen.


    For me I used a vector of lantern CRCs to also support some of my custom lanterns, maybe thats also something for your version to consider for GetLanternCRC()

    Bitte melden Sie sich an, um diesen Anhang zu sehen.

    If you are using your code to give instructions to another entity you could also pass its current coords and then std::sort() the vector of the found npcs (if there were multiple) by distance to that entity.

    So you could easily pick the closest .front() npc of them for your entity if needed.

    There is a source function "DISTANCE_APPROX", which you can use for this sorting.

    Und mit ciftel1.tga hat man meistens immer auf irgend so ner komplett random überfüllten farmmap gefarmt weil das teil irgendwie x tausend mob hatte und tekel32.tga hatte immer so komplett op viel halbis und man hat alles geonehitted pvp:joy:

    Ungültiger Pointer trifft es gut, ich denke das irgendein window im vektor ein dangling pointer ist der auf junk zeigt, und wenn delete den Destruktor von diesem window aufrufen will er dann crasht. Dein Code wird das aber nicht erkennen, er weiß ja nicht ob der pointer auf junk zeigt, für ihn ist so alles was im vektor steht ein window pointer der destroyed werden muss.


    In der Situation hilft dann nur debugen, sonst ist es die Nadel im Heuhaufen (milde gesagt). Solche Pointer sind mit die aufwendigsten Fehler die man haben kann.


    Übrigens für einen nullptr check mit anschließendem nullptr setzen bei delete gibt es is der source auch ein Macro das man nutzen kann, dann entstehen schonmal keine neuen dangling pointer, weil man das nullptr setzen vielleicht mal vergisst.

    Bitte melden Sie sich an, um diesen Anhang zu sehen.


    Aber vor dangling pointern die schon entstanden sind schützt das natürlich nicht, da muss man dann debugen, da kommt man nicht drum rum.

    wieso fühlst du dich so angegriffen, als hätte jemand deine Eltern ermordet? Raupy hat gute Argumente geliefert wieso man es nicht machen soll und du bist direkt beleidigt wie ein kleines Mädchen.

    Wo sind das gute Argumente? Wenn man nicht mal liest was ich schreibe. Es kann an keinem Windows liegen was crasht. Es haben ja nicht alle.

    Dir ist anscheinend nicht mehr zu helfen, wenn man diesen AntiFix einbaut dann hat man größere Probleme als vorher, jeder der das einbaut fickt sich die Source. Darum geht es mir, dass du sowas einfach als Fix verbreitest. Das ist einfach nur Sabotage an jeden der es nicht besser weiß.

    Wtf der comment killt auch alles "The above code not need, cause is cleaning it anyway from the vector i think."

    Das cleared nur den Vektor aber freed nicht den memory den du allokiert hast.

    Dafür hat man ja dort den Vektor, damit du weißt was du freen musst und Zugang dazu hast.

    Das kannst du nur machen wenn du z.b. unique_ptr oder andere smart pointer nutzt die sich selbst darum kümmern. Dann hätte man es so machen können aber so ist das Memory Leak des Grauens und wer weiß was sonst noch so passiert, wird auf jeden Fall nicht langweilig werden


    Bitte melden Sie sich an, um dieses Medienelement zu sehen.



    Ich würd mal lieber schauen welche windows dort crashen, und mich um die kümmern.

    Wer die delete Zeile löscht ist auch komplett durch "Have Fun":CryThumbsUp:

    Wenn dein Client sich schließt und du nicht "nur" gekickt wirst, würde ich erstmal clientside gucken, warum er überhaupt crasht. Starte deine Binary doch mal mit dem Debugger, dann zeigt er dir ja genau die Codestelle wo er crasht und du weißt was Schuld ist, sonst spekuliert man sich nur zu Tode.