From e8cbdde5189cb55645b55f828ad9e8365abf8e4e Mon Sep 17 00:00:00 2001 From: WinDanesz <31292708+WinDanesz@users.noreply.github.com> Date: Sun, 26 Dec 2021 22:03:54 +0100 Subject: [PATCH] Splitting PacketSpellProperties into batches of 100 spells. Fixes world load issue with large list of spells --- .../packet/PacketSpellProperties.java | 21 ++++++++++++------- .../electroblob/wizardry/spell/Spell.java | 20 ++++++++++++++++-- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/main/java/electroblob/wizardry/packet/PacketSpellProperties.java b/src/main/java/electroblob/wizardry/packet/PacketSpellProperties.java index 42852c93..b1ea515a 100644 --- a/src/main/java/electroblob/wizardry/packet/PacketSpellProperties.java +++ b/src/main/java/electroblob/wizardry/packet/PacketSpellProperties.java @@ -20,7 +20,9 @@ public class PacketSpellProperties implements IMessageHandler { - for(int i=0; i propertiesList = new ArrayList<>(); - int i = 0; - - while(buf.isReadable()){ + int i = buf.readInt(); + count = buf.readInt(); + firstId = i; + while(buf.isReadable() && i < count){ propertiesList.add(new SpellProperties(Spell.byNetworkID(i++), buf)); } @@ -55,6 +60,8 @@ public class PacketSpellProperties implements IMessageHandler implements C // To avoid sending extra data unnecessarily, the spell properties are sent in order of spell ID List spells = new ArrayList<>(registry.getValuesCollection()); spells.sort(Comparator.comparingInt(Spell::networkID)); - WizardryPacketHandler.net.sendTo(new PacketSpellProperties.Message(spells.stream() - .map(s -> s.properties).toArray(SpellProperties[]::new)), player); + + SpellProperties[] propertiesArray = spells.stream().map(s -> s.properties).toArray(SpellProperties[]::new); + + // splitting the packet into batches of 100 spells + int i = 0; + while (i < propertiesArray.length) { + List propertiesList = new ArrayList<>(); + int first = i; + int batchCounter = 0; + for (int currentIndex = i; currentIndex < propertiesArray.length && batchCounter < 100; currentIndex++) { + propertiesList.add(propertiesArray[currentIndex]); + batchCounter++; + i++; + } + SpellProperties[] currentArray = propertiesList.toArray(new SpellProperties[0]); + PacketSpellProperties.Message currentPacket = new PacketSpellProperties.Message(first, currentArray.length, currentArray); + WizardryPacketHandler.net.sendTo(currentPacket, player); + } } private static void clearProperties(){