Skip to content

Commit 8e030e0

Browse files
committed
Further improved the TrappingXPTest
1 parent 49d9254 commit 8e030e0

3 files changed

Lines changed: 35 additions & 26 deletions

File tree

src/main/java/com/projectswg/holocore/resources/support/data/collections/SWGMap.java

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
/***********************************************************************************
2-
* Copyright (c) 2024 /// Project SWG /// www.projectswg.com *
2+
* Copyright (c) 2025 /// Project SWG /// www.projectswg.com *
33
* *
4-
* ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on *
4+
* ProjectSWG is an emulation project for Star Wars Galaxies founded on *
55
* July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. *
6-
* Our goal is to create an emulator which will provide a server for players to *
7-
* continue playing a game similar to the one they used to play. We are basing *
8-
* it on the final publish of the game prior to end-game events. *
6+
* Our goal is to create one or more emulators which will provide servers for *
7+
* players to continue playing a game similar to the one they used to play. *
98
* *
109
* This file is part of Holocore. *
1110
* *
@@ -182,13 +181,17 @@ public void decode(ByteBuffer data, StringType keyType, Class<V> vType) {
182181
NetBuffer buffer = NetBuffer.wrap(data);
183182
try {
184183
for (int i = 0; i < size; i++) {
185-
buffer.getByte();
184+
byte updateType = buffer.getByte();
186185
String key = buffer.getString(keyType);
187186
Object value = buffer.getGeneric(vType);
188-
if (value != null && vType.isAssignableFrom(value.getClass()))
189-
put((K) key, (V) value);
190-
else
191-
Log.e("Unable to parse: key=%s value=%s", key, value);
187+
if (updateType == 0 || updateType == 2) {
188+
if (value != null && vType.isAssignableFrom(value.getClass()))
189+
put((K) key, (V) value);
190+
else
191+
Log.e("Unable to parse: key=%s value=%s", key, value);
192+
} else if (updateType == 1) {
193+
remove(key);
194+
}
192195
}
193196
} catch (ClassCastException e) {
194197
Log.e(e);
@@ -204,7 +207,7 @@ public void decode(ByteBuffer data, Class<K> kType, Class<V> vType) {
204207

205208
NetBuffer buffer = NetBuffer.wrap(data);
206209
for (int i = 0; i < size; i++) {
207-
buffer.getByte();
210+
byte updateType = buffer.getByte();
208211
Object key = buffer.getGeneric(kType);
209212
if (key == null) {
210213
Log.e("Failed to decode: " + kType.getSimpleName());
@@ -215,10 +218,14 @@ public void decode(ByteBuffer data, Class<K> kType, Class<V> vType) {
215218
Log.e("Failed to decode: " + vType.getSimpleName());
216219
break;
217220
}
218-
if (kType.isAssignableFrom(key.getClass()) && vType.isAssignableFrom(value.getClass()))
219-
put((K) key, (V) value);
220-
else
221-
Log.e("Failed to insert key=" + key + " value=" + value);
221+
if (updateType == 0 || updateType == 2) {
222+
if (kType.isAssignableFrom(key.getClass()) && vType.isAssignableFrom(value.getClass()))
223+
put((K) key, (V) value);
224+
else
225+
Log.e("Failed to insert key=" + key + " value=" + value);
226+
} else if (updateType == 1) {
227+
remove(key);
228+
}
222229
}
223230
clearDeltaQueue();
224231
}

src/test/java/com/projectswg/holocore/headless/experience.kt

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,21 @@
2525
***********************************************************************************/
2626
package com.projectswg.holocore.headless
2727

28-
import com.projectswg.common.network.NetBuffer
28+
import com.projectswg.common.encoding.StringType
29+
import com.projectswg.holocore.resources.support.data.collections.SWGMap
30+
import java.nio.ByteBuffer
31+
import java.nio.ByteOrder
2932
import java.util.concurrent.TimeUnit
3033

3134
fun ZonedInCharacter.waitForExperiencePoints(xpType: String) {
35+
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") // We want a Java boxed int for now
36+
val experienceMap = SWGMap<String, Integer>(8, 0, StringType.ASCII)
3237
while (true) { // Quits naturally when the packet timeout is exceeded
3338
val experienceDelta = player.waitForNextObjectDelta(player.playerObject.objectId, 8, 0, 50, TimeUnit.MILLISECONDS) ?: throw IllegalStateException("No XP delta received")
34-
// TODO: Add a proper parser for SWGMap deltas
35-
val deltasData = NetBuffer.wrap(experienceDelta.deltaData)
36-
deltasData.seek(9)
37-
val deltaXpType = deltasData.ascii
38-
if (deltaXpType == xpType)
39-
return
39+
experienceMap.decode(ByteBuffer.wrap(experienceDelta.deltaData).order(ByteOrder.LITTLE_ENDIAN), StringType.ASCII, Integer::class.java)
40+
if (experienceMap.containsKey(xpType))
41+
break
4042
}
4143
}
4244

43-
private fun ZonedInCharacter.getXP(xpType: String) = player.playerObject.getExperiencePoints(xpType)
45+
fun ZonedInCharacter.getXP(xpType: String) = player.playerObject.getExperiencePoints(xpType)

src/test/java/com/projectswg/holocore/services/gameplay/player/experience/TrappingXPTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class TrappingXPTest : AcceptanceTest() {
4545

4646
// There are three types of XP we receive from this kill: combat_meleespecialize_unarmed, trapping, and combat_general
4747
character.waitForExperiencePoints("trapping")
48-
assertTrue(character.player.playerObject.getExperiencePoints("trapping") > 0)
48+
assertTrue(character.getXP("trapping") > 0)
4949
}
5050

5151
@Test
@@ -57,7 +57,7 @@ class TrappingXPTest : AcceptanceTest() {
5757

5858
killTarget(character, npc)
5959

60-
assertEquals(0, character.player.playerObject.getExperiencePoints("trapping"))
60+
assertEquals(0, character.getXP("trapping"))
6161
}
6262

6363
@Test
@@ -68,7 +68,7 @@ class TrappingXPTest : AcceptanceTest() {
6868

6969
killTarget(character, npc)
7070

71-
assertEquals(0, character.player.playerObject.getExperiencePoints("trapping"))
71+
assertEquals(0, character.getXP("trapping"))
7272
}
7373

7474
private fun killTarget(character: ZonedInCharacter, target: CreatureObject) {

0 commit comments

Comments
 (0)