ChunkMap für Minecraftclient

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    ChunkMap für Minecraftclient

    Hi Leute,
    ich habe mir einen Minecraft-Client mit Server-Kommunikation (Packets...) und OpenTK gemacht. jetzt habe ich das Problem, dass ich ein Dictionary habe, in dem die Chunks gespeichert sind

    VB.NET-Quellcode

    1. Public chunks As New Dictionary(Of Vector2, Chunk)

    und das lese ich im WorldRenderer andauernd (bei jedem Frame) so aus:

    VB.NET-Quellcode

    1. Dim l = world.chunks.Values
    2. For i As Integer = 0 To l.Count - 1
    3. Dim c As Chunk = l(i)
    4. chunkRenderer.RenderChunk(c)
    5. Next

    Das funktioniert auch so weit, jetzt ist aber das Problem, dass sobald mein PacketListener einen neuen Chunk empfängt:

    VB.NET-Quellcode

    1. Public Overrides Sub onChunkReceived(chunk As TwometersMinecraftClient.world.craft.CraftChunk)
    2. TheGame.theWorld.doPreChunk(chunk.x, chunk.z).ImportChunk(chunk)
    3. End Sub

    also

    VB.NET-Quellcode

    1. Public Function doPreChunk(x As Integer, z As Integer) As Chunk
    2. Dim c As New Chunk(x, z)
    3. chunks.Add(New Vector2(x, z), c)
    4. Return c
    5. End Function


    Sobald das ausgeführt wird, kommt dieser schöne Fehler:


    Was kann ich dagegen tun?
    Probiere jetzt schon das X-Te aus und hab auch schon gegoogelt :/

    Danke im Voraus

    LG
    Twometer
    An Error 404 occurred while loading signature...
    Wäre natürlich von nutzen zu wissen, welche Auflistung das ist. Im Grunde ist es so, dass du irgendwo einen Enumerator hast. Über diesen wird irgendwo iteriert und während dies geschieht, änderst du das diesen. Aus deinem Code geht nicht klar hervor über welchen Enumerator wir hier sprechen. Aber ich gehe mal davon aus, dass der Aufruf chunks.Add der ändernde Vorgang ist.
    Synchronisiere mal testweise beide Methoden. Also das Rendern und das Hinzufügen des neuen Chunks.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Hi Leute,
    so ich habe das jetzt so gemacht (funktioniert auch), aber das ist nicht so ganz die feine englische Art...

    VB.NET-Quellcode

    1. For i As Integer = 0 To l.Count - 1
    2. Try
    3. Dim c As Chunk = l(i)
    4. chunkRenderer.RenderChunk(c)
    5. Catch ex As Exception
    6. Continue For
    7. End Try
    8. Next


    Und ja, der chunks.add-Aufruf ist der ändernde Vorgang. Hat jemand eine bessere Idee, wie das zu lösen ist? Ich habe das concurrentDictionary schon ausprobiert, aber da kann ich keine Chunks mehr löschen??

    LG
    Twometer
    An Error 404 occurred while loading signature...
    Das ist mir schon klar, aber ich kann ja nur nen ganzen Eintrag löschen, ich kann nicht sagen RemoveKey oder so
    //EDIT: ich habe festgestellt, dass man vielleicht mal lesen sollte xD, jetzt funktionierts. Danke Leute!
    An Error 404 occurred while loading signature...
    Chunkrenderer weiß nur etwas von den chunks, während er geladen wird, danach sind chunks und renderer komplett unabhängig. Rendern hat immer Priorität und das einreihen von neuen chunkrenderern ist nicht so wichtig
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---