• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

PlugIn Map gibt immer das gleiche Value aus

xXSchrandXx

Schafhirte
Registriert
16 September 2012
Beiträge
126
Diamanten
302
Minecraft
xXSchrandXx
Hi,

ich habe für mein Plugin eine ConcurrentHashMap<String, WorldData> (gesetzt in WorldConfigManager.loadAllWorlddatas mit WorldConfigManager.setWorldData).
YAML:
...
[Server thread/INFO]: Debug: Storage.setWorldData | Setting test1
WorldData{WorldName=test1, Environment=NORMAL, Aliases=[test1], AllowAnimalSpawning=true, AllowMonsterSpawning=true, AmbientLimit=15, AnimalLimit=10, AutoLoad=true, AutoSave=true, CreationType=normal, Difficulty=EASY, disabledEntities=[], EnableCommandBlocks=false, GameMode=SURVIVAL, Gamerule={Rule{key=doInsomnia, type=class java.lang.Boolean}=true, Rule{key=doEntityDrops, type=class java.lang.Boolean}=true, Rule{key=spawnRadius, type=class java.lang.Integer}=10, Rule{key=drowningDamage, type=class java.lang.Boolean}=true, Rule{key=fallDamage, type=class java.lang.Boolean}=true, Rule{key=doWeatherCycle, type=class java.lang.Boolean}=true, Rule{key=disableRaids, type=class java.lang.Boolean}=false, Rule{key=logAdminCommands, type=class java.lang.Boolean}=true, Rule{key=maxCommandChainLength, type=class java.lang.Integer}=65536, Rule{key=sendCommandFeedback, type=class java.lang.Boolean}=true, Rule{key=spectatorsGenerateChunks, type=class java.lang.Boolean}=true, Rule{key=doImmediateRespawn, type=class java.lang.Boolean}=false, Rule{key=doLimitedCrafting, type=class java.lang.Boolean}=false, Rule{key=keepInventory, type=class java.lang.Boolean}=false, Rule{key=announceAdvancements, type=class java.lang.Boolean}=true, Rule{key=randomTickSpeed, type=class java.lang.Integer}=3, Rule{key=commandBlockOutput, type=class java.lang.Boolean}=true, Rule{key=fireDamage, type=class java.lang.Boolean}=true, Rule{key=naturalRegeneration, type=class java.lang.Boolean}=true, Rule{key=doMobSpawning, type=class java.lang.Boolean}=true, Rule{key=mobGriefing, type=class java.lang.Boolean}=true, Rule{key=doFireTick, type=class java.lang.Boolean}=true, Rule{key=showDeathMessages, type=class java.lang.Boolean}=true, Rule{key=disableElytraMovementCheck, type=class java.lang.Boolean}=false, Rule{key=doTileDrops, type=class java.lang.Boolean}=true, Rule{key=reducedDebugInfo, type=class java.lang.Boolean}=false, Rule{key=maxEntityCramming, type=class java.lang.Integer}=24, Rule{key=doMobLoot, type=class java.lang.Boolean}=true, Rule{key=doDaylightCycle, type=class java.lang.Boolean}=true}, Generator=null, generateStructures=true, Hardcore=false, KeepSpawninMemory=false, MonsterLimit=70, PITCH=0.0, PvP=true, Seed=3390652174426575371, Storm=false, Thunder=false, ThunderDuration?=0, TicksPerAmbientSpawns=1, TicksPerAnimalSpawns=400, TicksPerMonsterSpawns=1, TicksPerWaterSpawns=1, Time=0, WaterAnimalLimit=15, WeatherDuration=0, WorldType=NORMAL, X=80.0, Y=66.0, YAW=0.0, Z=16.0}
...
[Server thread/INFO]: Debug: Storage.setWorldData | Setting world
WorldData{WorldName=world, Environment=NORMAL, Aliases=[world], AllowAnimalSpawning=true, AllowMonsterSpawning=true, AmbientLimit=15, AnimalLimit=10, AutoLoad=false, AutoSave=true, CreationType=normal, Difficulty=EASY, disabledEntities=[], EnableCommandBlocks=false, GameMode=SURVIVAL, Gamerule={Rule{key=doInsomnia, type=class java.lang.Boolean}=true, Rule{key=doEntityDrops, type=class java.lang.Boolean}=true, Rule{key=spawnRadius, type=class java.lang.Integer}=10, Rule{key=drowningDamage, type=class java.lang.Boolean}=true, Rule{key=fallDamage, type=class java.lang.Boolean}=true, Rule{key=doWeatherCycle, type=class java.lang.Boolean}=true, Rule{key=disableRaids, type=class java.lang.Boolean}=false, Rule{key=logAdminCommands, type=class java.lang.Boolean}=true, Rule{key=maxCommandChainLength, type=class java.lang.Integer}=65536, Rule{key=sendCommandFeedback, type=class java.lang.Boolean}=true, Rule{key=spectatorsGenerateChunks, type=class java.lang.Boolean}=true, Rule{key=doImmediateRespawn, type=class java.lang.Boolean}=false, Rule{key=doLimitedCrafting, type=class java.lang.Boolean}=false, Rule{key=keepInventory, type=class java.lang.Boolean}=false, Rule{key=announceAdvancements, type=class java.lang.Boolean}=true, Rule{key=randomTickSpeed, type=class java.lang.Integer}=3, Rule{key=commandBlockOutput, type=class java.lang.Boolean}=true, Rule{key=fireDamage, type=class java.lang.Boolean}=true, Rule{key=naturalRegeneration, type=class java.lang.Boolean}=true, Rule{key=doMobSpawning, type=class java.lang.Boolean}=true, Rule{key=mobGriefing, type=class java.lang.Boolean}=true, Rule{key=doFireTick, type=class java.lang.Boolean}=true, Rule{key=showDeathMessages, type=class java.lang.Boolean}=true, Rule{key=disableElytraMovementCheck, type=class java.lang.Boolean}=false, Rule{key=reducedDebugInfo, type=class java.lang.Boolean}=false, Rule{key=doTileDrops, type=class java.lang.Boolean}=true, Rule{key=maxEntityCramming, type=class java.lang.Integer}=24, Rule{key=doMobLoot, type=class java.lang.Boolean}=true, Rule{key=doDaylightCycle, type=class java.lang.Boolean}=true}, Generator=null, generateStructures=true, Hardcore=false, KeepSpawninMemory=true, MonsterLimit=70, PITCH=0.0, PvP=true, Seed=3390652174426575371, Storm=true, Thunder=false, ThunderDuration?=48027, TicksPerAmbientSpawns=1, TicksPerAnimalSpawns=400, TicksPerMonsterSpawns=1, TicksPerWaterSpawns=1, Time=8209, WaterAnimalLimit=15, WeatherDuration=14222, WorldType=NORMAL, X=0.0, Y=0.0, YAW=0.0, Z=0.0}
...
Jedoch bekomme ich jedesmal bei WorldConfigManager.getWorlddataFromName die WorldData, welche mit den Key vom String "world" gesetzt wurde...
YAML:
...
[Craft Scheduler Thread - 3/INFO]: Debug: WorldConfigManager.getWorlddataFromName | Getting WorldData for test1
WorldData{WorldName=world, Environment=NORMAL, Aliases=[world], AllowAnimalSpawning=true, AllowMonsterSpawning=true, AmbientLimit=15, AnimalLimit=10, AutoLoad=false, AutoSave=true, CreationType=normal, Difficulty=EASY, disabledEntities=[], EnableCommandBlocks=false, GameMode=SURVIVAL, Gamerule={Rule{key=doInsomnia, type=class java.lang.Boolean}=true, Rule{key=doEntityDrops, type=class java.lang.Boolean}=true, Rule{key=spawnRadius, type=class java.lang.Integer}=10, Rule{key=drowningDamage, type=class java.lang.Boolean}=true, Rule{key=fallDamage, type=class java.lang.Boolean}=true, Rule{key=doWeatherCycle, type=class java.lang.Boolean}=true, Rule{key=disableRaids, type=class java.lang.Boolean}=false, Rule{key=logAdminCommands, type=class java.lang.Boolean}=true, Rule{key=maxCommandChainLength, type=class java.lang.Integer}=65536, Rule{key=sendCommandFeedback, type=class java.lang.Boolean}=true, Rule{key=spectatorsGenerateChunks, type=class java.lang.Boolean}=true, Rule{key=doImmediateRespawn, type=class java.lang.Boolean}=false, Rule{key=doLimitedCrafting, type=class java.lang.Boolean}=false, Rule{key=keepInventory, type=class java.lang.Boolean}=false, Rule{key=announceAdvancements, type=class java.lang.Boolean}=true, Rule{key=randomTickSpeed, type=class java.lang.Integer}=3, Rule{key=commandBlockOutput, type=class java.lang.Boolean}=true, Rule{key=fireDamage, type=class java.lang.Boolean}=true, Rule{key=naturalRegeneration, type=class java.lang.Boolean}=true, Rule{key=doMobSpawning, type=class java.lang.Boolean}=true, Rule{key=mobGriefing, type=class java.lang.Boolean}=true, Rule{key=doFireTick, type=class java.lang.Boolean}=true, Rule{key=showDeathMessages, type=class java.lang.Boolean}=true, Rule{key=disableElytraMovementCheck, type=class java.lang.Boolean}=false, Rule{key=reducedDebugInfo, type=class java.lang.Boolean}=false, Rule{key=doTileDrops, type=class java.lang.Boolean}=true, Rule{key=maxEntityCramming, type=class java.lang.Integer}=24, Rule{key=doMobLoot, type=class java.lang.Boolean}=true, Rule{key=doDaylightCycle, type=class java.lang.Boolean}=true}, Generator=null, generateStructures=true, Hardcore=false, KeepSpawninMemory=true, MonsterLimit=70, PITCH=0.0, PvP=true, Seed=3390652174426575371, Storm=true, Thunder=false, ThunderDuration?=48027, TicksPerAmbientSpawns=1, TicksPerAnimalSpawns=400, TicksPerMonsterSpawns=1, TicksPerWaterSpawns=1, Time=8209, WaterAnimalLimit=15, WeatherDuration=14222, WorldType=NORMAL, X=0.0, Y=0.0, YAW=0.0, Z=0.0}
...
[Craft Scheduler Thread - 3/INFO]: Debug: WorldConfigManager.getWorlddataFromName | Getting WorldData for world
WorldData{WorldName=world, Environment=NORMAL, Aliases=[world], AllowAnimalSpawning=true, AllowMonsterSpawning=true, AmbientLimit=15, AnimalLimit=10, AutoLoad=false, AutoSave=true, CreationType=normal, Difficulty=EASY, disabledEntities=[], EnableCommandBlocks=false, GameMode=SURVIVAL, Gamerule={Rule{key=doInsomnia, type=class java.lang.Boolean}=true, Rule{key=doEntityDrops, type=class java.lang.Boolean}=true, Rule{key=spawnRadius, type=class java.lang.Integer}=10, Rule{key=drowningDamage, type=class java.lang.Boolean}=true, Rule{key=fallDamage, type=class java.lang.Boolean}=true, Rule{key=doWeatherCycle, type=class java.lang.Boolean}=true, Rule{key=disableRaids, type=class java.lang.Boolean}=false, Rule{key=logAdminCommands, type=class java.lang.Boolean}=true, Rule{key=maxCommandChainLength, type=class java.lang.Integer}=65536, Rule{key=sendCommandFeedback, type=class java.lang.Boolean}=true, Rule{key=spectatorsGenerateChunks, type=class java.lang.Boolean}=true, Rule{key=doImmediateRespawn, type=class java.lang.Boolean}=false, Rule{key=doLimitedCrafting, type=class java.lang.Boolean}=false, Rule{key=keepInventory, type=class java.lang.Boolean}=false, Rule{key=announceAdvancements, type=class java.lang.Boolean}=true, Rule{key=randomTickSpeed, type=class java.lang.Integer}=3, Rule{key=commandBlockOutput, type=class java.lang.Boolean}=true, Rule{key=fireDamage, type=class java.lang.Boolean}=true, Rule{key=naturalRegeneration, type=class java.lang.Boolean}=true, Rule{key=doMobSpawning, type=class java.lang.Boolean}=true, Rule{key=mobGriefing, type=class java.lang.Boolean}=true, Rule{key=doFireTick, type=class java.lang.Boolean}=true, Rule{key=showDeathMessages, type=class java.lang.Boolean}=true, Rule{key=disableElytraMovementCheck, type=class java.lang.Boolean}=false, Rule{key=reducedDebugInfo, type=class java.lang.Boolean}=false, Rule{key=doTileDrops, type=class java.lang.Boolean}=true, Rule{key=maxEntityCramming, type=class java.lang.Integer}=24, Rule{key=doMobLoot, type=class java.lang.Boolean}=true, Rule{key=doDaylightCycle, type=class java.lang.Boolean}=true}, Generator=null, generateStructures=true, Hardcore=false, KeepSpawninMemory=true, MonsterLimit=70, PITCH=0.0, PvP=true, Seed=3390652174426575371, Storm=true, Thunder=false, ThunderDuration?=48027, TicksPerAmbientSpawns=1, TicksPerAnimalSpawns=400, TicksPerMonsterSpawns=1, TicksPerWaterSpawns=1, Time=8209, WaterAnimalLimit=15, WeatherDuration=14222, WorldType=NORMAL, X=0.0, Y=0.0, YAW=0.0, Z=0.0}
...
Wo habe ich den Fehler??
Danke schon mal für eure Hilfe, und entschuldigt, dass die WorldConfigManager Class so unaufgeräumt ist...


Mit freundlichem Gruß

xXSchrandXx
 
Zuletzt bearbeitet:
Registriert
10 Dezember 2017
Beiträge
161
Alter
26
Diamanten
322
Minecraft
DerFrZocker
Durchs grobe drüber schauen denke ich das deine Map immer mit dem gleichen Object als value gefüllt wird und nicht mit einem neuen. Und dies liegt daran das du immer das gleiche WorldData Object benutzt und zwar Storage.defaultworlddata. Dieses object nimmst du immer wieder und überschreibt es Anstatt eine copie zu bearbeiten.
 

xXSchrandXx

Schafhirte
Registriert
16 September 2012
Beiträge
126
Diamanten
302
Minecraft
xXSchrandXx
Um das zu prüfen hatte ich in der Methode bei setWorlddata ja noch eingetragen, dass es den Log ausgeben soll (der im ersten Spoiler). Beim setzen soll das anscheinend noch alles richtig sein. Nur beim abfragen (getWorddataFromName im zweiten spoiler) ist es dann anders...

PS: Ich habe in der Message vom Log noch einen Fehler drin, das 'Storage' muss jetzt eigentlich auch 'WorldConfigManager' heißen.
 

SirYwell

PlotSquared Entwickler
Registriert
30 Juni 2017
Beiträge
540
Diamanten
488
Minecraft
SirYwell
Ich hab mir nicht alles angeschaut, aber auf Basis @DerFrZocker s Erkenntnis ist eigentlich logisch, dass die Ausgabe so ist, wie sie aktuell ist. Gib mal nach jedem Einfügen in die Map den kompletten Mapinhalt aus oder überprüfe die beiden Elemente mit ==, dann wirst du sehen, dass das die gleiche Referenz ist. Im Allgemeinen ist es empfehlenswert, Klassen unveränderlich (immutable) zu gestalten, dann passiert sowas auch nicht
 

xXSchrandXx

Schafhirte
Registriert
16 September 2012
Beiträge
126
Diamanten
302
Minecraft
xXSchrandXx
Gib mal nach jedem Einfügen in die Map den kompletten Mapinhalt aus
Habe ich in den Spoilern.
Vor worlddatas.put(worldname, worlddata):
...
[Server thread/INFO]: Debug: WorldConfigManager.setWorldData | Setting test1
WorldData{WorldName=test1, Environment=NORMAL, Aliases=[test1], AllowAnimalSpawning=true, AllowMonsterSpawning=true, AmbientLimit=15, AnimalLimit=10, AutoLoad=true, AutoSave=true, CreationType=normal, Difficulty=EASY, disabledEntities=[], EnableCommandBlocks=false, GameMode=SURVIVAL, Gamerule={Rule{key=doInsomnia, type=class java.lang.Boolean}=true, Rule{key=doEntityDrops, type=class java.lang.Boolean}=true, Rule{key=spawnRadius, type=class java.lang.Integer}=10, Rule{key=drowningDamage, type=class java.lang.Boolean}=true, Rule{key=fallDamage, type=class java.lang.Boolean}=true, Rule{key=doWeatherCycle, type=class java.lang.Boolean}=true, Rule{key=disableRaids, type=class java.lang.Boolean}=false, Rule{key=logAdminCommands, type=class java.lang.Boolean}=true, Rule{key=maxCommandChainLength, type=class java.lang.Integer}=65536, Rule{key=sendCommandFeedback, type=class java.lang.Boolean}=true, Rule{key=spectatorsGenerateChunks, type=class java.lang.Boolean}=true, Rule{key=doImmediateRespawn, type=class java.lang.Boolean}=false, Rule{key=doLimitedCrafting, type=class java.lang.Boolean}=false, Rule{key=keepInventory, type=class java.lang.Boolean}=false, Rule{key=announceAdvancements, type=class java.lang.Boolean}=true, Rule{key=randomTickSpeed, type=class java.lang.Integer}=3, Rule{key=commandBlockOutput, type=class java.lang.Boolean}=true, Rule{key=fireDamage, type=class java.lang.Boolean}=true, Rule{key=naturalRegeneration, type=class java.lang.Boolean}=true, Rule{key=doMobSpawning, type=class java.lang.Boolean}=true, Rule{key=mobGriefing, type=class java.lang.Boolean}=true, Rule{key=doFireTick, type=class java.lang.Boolean}=true, Rule{key=showDeathMessages, type=class java.lang.Boolean}=true, Rule{key=disableElytraMovementCheck, type=class java.lang.Boolean}=false, Rule{key=doTileDrops, type=class java.lang.Boolean}=true, Rule{key=reducedDebugInfo, type=class java.lang.Boolean}=false, Rule{key=maxEntityCramming, type=class java.lang.Integer}=24, Rule{key=doMobLoot, type=class java.lang.Boolean}=true, Rule{key=doDaylightCycle, type=class java.lang.Boolean}=true}, Generator=null, generateStructures=true, Hardcore=false, KeepSpawninMemory=false, MonsterLimit=70, PITCH=0.0, PvP=true, Seed=3390652174426575371, Storm=false, Thunder=false, ThunderDuration?=0, TicksPerAmbientSpawns=1, TicksPerAnimalSpawns=400, TicksPerMonsterSpawns=1, TicksPerWaterSpawns=1, Time=0, WaterAnimalLimit=15, WeatherDuration=0, WorldType=NORMAL, X=80.0, Y=66.0, YAW=0.0, Z=16.0}
...
[Server thread/INFO]: Debug: WorldConfigManager.setWorldData | Setting world
WorldData{WorldName=world, Environment=NORMAL, Aliases=[world], AllowAnimalSpawning=true, AllowMonsterSpawning=true, AmbientLimit=15, AnimalLimit=10, AutoLoad=false, AutoSave=true, CreationType=normal, Difficulty=EASY, disabledEntities=[], EnableCommandBlocks=false, GameMode=SURVIVAL, Gamerule={Rule{key=doInsomnia, type=class java.lang.Boolean}=true, Rule{key=doEntityDrops, type=class java.lang.Boolean}=true, Rule{key=spawnRadius, type=class java.lang.Integer}=10, Rule{key=drowningDamage, type=class java.lang.Boolean}=true, Rule{key=fallDamage, type=class java.lang.Boolean}=true, Rule{key=doWeatherCycle, type=class java.lang.Boolean}=true, Rule{key=disableRaids, type=class java.lang.Boolean}=false, Rule{key=logAdminCommands, type=class java.lang.Boolean}=true, Rule{key=maxCommandChainLength, type=class java.lang.Integer}=65536, Rule{key=sendCommandFeedback, type=class java.lang.Boolean}=true, Rule{key=spectatorsGenerateChunks, type=class java.lang.Boolean}=true, Rule{key=doImmediateRespawn, type=class java.lang.Boolean}=false, Rule{key=doLimitedCrafting, type=class java.lang.Boolean}=false, Rule{key=keepInventory, type=class java.lang.Boolean}=false, Rule{key=announceAdvancements, type=class java.lang.Boolean}=true, Rule{key=randomTickSpeed, type=class java.lang.Integer}=3, Rule{key=commandBlockOutput, type=class java.lang.Boolean}=true, Rule{key=fireDamage, type=class java.lang.Boolean}=true, Rule{key=naturalRegeneration, type=class java.lang.Boolean}=true, Rule{key=doMobSpawning, type=class java.lang.Boolean}=true, Rule{key=mobGriefing, type=class java.lang.Boolean}=true, Rule{key=doFireTick, type=class java.lang.Boolean}=true, Rule{key=showDeathMessages, type=class java.lang.Boolean}=true, Rule{key=disableElytraMovementCheck, type=class java.lang.Boolean}=false, Rule{key=reducedDebugInfo, type=class java.lang.Boolean}=false, Rule{key=doTileDrops, type=class java.lang.Boolean}=true, Rule{key=maxEntityCramming, type=class java.lang.Integer}=24, Rule{key=doMobLoot, type=class java.lang.Boolean}=true, Rule{key=doDaylightCycle, type=class java.lang.Boolean}=true}, Generator=null, generateStructures=true, Hardcore=false, KeepSpawninMemory=true, MonsterLimit=70, PITCH=0.0, PvP=true, Seed=3390652174426575371, Storm=true, Thunder=false, ThunderDuration?=48027, TicksPerAmbientSpawns=1, TicksPerAnimalSpawns=400, TicksPerMonsterSpawns=1, TicksPerWaterSpawns=1, Time=8209, WaterAnimalLimit=15, WeatherDuration=14222, WorldType=NORMAL, X=0.0, Y=0.0, YAW=0.0, Z=0.0}
...
Demnach müsste z. B. der Name und der Spawn verschieden sein...

Klassen unveränderlich (immutable) zu gestalten
Ich habe zur WorldData Class ein "final" hinzugefügt. Bei den enum (Modfier) geht das ja nicht.

überschreibt es Anstatt eine Kopie zu bearbeiten
Ich benutze jetzt new WorldData(Storage.defaultworlddata);

WorldConfigManager
WorldData

Jedoch bekomme ich immer noch die falsche WorldData (die von der Welt 'world')...
 
Zuletzt bearbeitet:
Registriert
10 Dezember 2017
Beiträge
161
Alter
26
Diamanten
322
Minecraft
DerFrZocker
Dadurch verwendest du immer noch die gleiche Map für Modifier über alle WorldData's hinweg. Besser ist da this.modifier.putAll(worlddata.getModifier() ) (voraus gesetzt die modifier und werte sind unveränderlich).

Ansonsten sollt eigentlich die richtige WorldData zurück gegeben werden (wenn man das mit den Modifier vernachlässigt), falls nicht müsste man doch einen genaueren blick in den code werfen. Für welches mir persönlich momentan die Zeit fehlt.

Ich habe zur WorldData Class ein "final" hinzugefügt. Bei den enum (Modfier) geht das ja nicht.
Ich denke @SirYwell meinte damit das der name, die enviroment, etc final / unveränderlich sind, sprich es garkeine set methode gibt. Sonder nur über den Konstruktor die werte Gesetz werden können. Dadurch würdest du das Problem mit dem überschrieben und verwenden der immer gleichen Object Instanze verhindern.
 
Oben