I found a possible bug where a java.util.Map.get() throws a NPE because the key is null.
How i call it indirectly:
Code: Select all
@Override
public void Deactivate()
{
for (int i = 0; i < _amountToSpawn; i++)
{
var enemy = _enemy[i];
if (enemy != null && _room.containsMMOItem(enemy)) // contained in room check passes
{
enemy.Target = null;
_mmoAPI.removeMMOItem(enemy); // here
}
}
if (!_saveState)
{
Arrays.fill(_enemy, null);
}
}Code: Select all
public void removeItem(BaseMMOItem item) {
P3D lastPos = item.getLastPos();
if (lastPos != null) { // null check done
ConcurrentLinkedQueue<BaseMMOItem> q = (ConcurrentLinkedQueue)this.map.get(lastPos);
if (q != null && !q.contains(item)) {
lastPos = this.findItemLocation(item); // lastPos reassigned but null check is not done again
q = (ConcurrentLinkedQueue)this.map.get(lastPos); // key == null == error
}
if (q != null) {
q.remove(item);
} else {
throw new IllegalStateException();
}
}
}Code: Select all
11:17:53,862 INFO [pool-1-thread-2] Extensions - {RoomExtension}: An error occurred in SimulationTask: Cannot invoke "Object.hashCode()" because "<parameter1>" is null
java.lang.NullPointerException: Cannot invoke "Object.hashCode()" because "<parameter1>" is null
at java.base/java.util.concurrent.ConcurrentHashMap.get(Unknown Source)
at com.smartfoxserver.v2.mmo.MMOItemManager.removeItem(MMOItemManager.java:152)
at com.smartfoxserver.v2.mmo.MMORoom.removeMMOItem(MMORoom.java:228)
at com.smartfoxserver.v2.api.SFSMMOApi.removeMMOItem(SFSMMOApi.java:169)
at data.world.spawner.EnemySpawner.Deactivate(EnemySpawner.java:370)
at manager.NodeManager.DeactivateNode(NodeManager.java:255)
at manager.NodeManager.DecrementNodeUserCount(NodeManager.java:228)
at manager.NodeManager.SetUserPosition(NodeManager.java:149)
at manager.MovementManager.ProcessInput(MovementManager.java:185)
at manager.SimulationManager$SimulationTask.run(SimulationManager.java:710)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.base/java.util.concurrent.FutureTask.runAndReset(Unknown Source)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)I added traces inside NodeManager.Activate and NodeManager.Deactivate to prove its only being called once:
Code: Select all
12:48:41,368 INFO [pool-1-thread-1] Extensions - {__lib__}: Called activate node: 5
12:48:41,369 INFO [pool-1-thread-1] Extensions - {__lib__}: Created 32 enemies
12:48:41,369 INFO [pool-1-thread-1] Extensions - {__lib__}: Created 31 enemies
12:48:41,369 INFO [pool-1-thread-1] Extensions - {__lib__}: Created 26 enemies
12:48:41,369 INFO [pool-1-thread-1] Extensions - {__lib__}: Called activate node: 9
12:48:41,369 INFO [pool-1-thread-1] Extensions - {__lib__}: Created 25 enemies
12:48:41,370 INFO [pool-1-thread-1] Extensions - {__lib__}: Created 24 enemies
12:48:41,370 INFO [pool-1-thread-1] Extensions - {__lib__}: Created 24 enemies
12:48:53,932 INFO [pool-1-thread-4] Extensions - {__lib__}: Called DEACTIVATE node: 4
12:48:53,932 INFO [pool-1-thread-4] Extensions - {__lib__}: Called DEACTIVATE node: 8
12:48:54,265 INFO [pool-1-thread-2] Extensions - {__lib__}: Called activate node: 6
12:48:54,265 INFO [pool-1-thread-2] Extensions - {__lib__}: Created 31 enemies
12:48:54,267 INFO [pool-1-thread-2] Extensions - {__lib__}: Created 27 enemies
12:48:54,268 INFO [pool-1-thread-2] Extensions - {__lib__}: Called activate node: 10
12:48:54,270 INFO [pool-1-thread-2] Extensions - {__lib__}: Created 29 enemies
12:49:11,064 INFO [pool-1-thread-3] Extensions - {__lib__}: Called DEACTIVATE node: 5
12:49:11,064 INFO [pool-1-thread-3] Extensions - {__lib__}: Called DEACTIVATE node: 9
12:49:11,497 INFO [pool-1-thread-1] Extensions - {__lib__}: Called activate node: 7
12:49:11,497 INFO [pool-1-thread-1] Extensions - {__lib__}: Created 28 enemies
12:49:11,499 INFO [pool-1-thread-1] Extensions - {__lib__}: Called activate node: 11
12:49:11,499 INFO [pool-1-thread-1] Extensions - {__lib__}: Created 24 enemies
12:49:27,162 INFO [pool-1-thread-1] Extensions - {__lib__}: Called DEACTIVATE node: 10
12:49:27,162 INFO [pool-1-thread-1] Extensions - {__lib__}: Called DEACTIVATE node: 11
12:49:27,830 INFO [pool-1-thread-3] Extensions - {__lib__}: Called activate node: 2
12:49:27,830 INFO [pool-1-thread-3] Extensions - {__lib__}: Created 28 enemies
12:49:27,832 INFO [pool-1-thread-3] Extensions - {__lib__}: Created 24 enemies
12:49:27,832 INFO [pool-1-thread-3] Extensions - {__lib__}: Called activate node: 3
12:49:33,262 INFO [pool-1-thread-2] Extensions - {__lib__}: Called DEACTIVATE node: 2
12:49:33,262 INFO [pool-1-thread-2] Extensions - {__lib__}: Called DEACTIVATE node: 3
12:49:33,661 INFO [pool-1-thread-2] Extensions - {__lib__}: Called activate node: 10
12:49:33,661 INFO [pool-1-thread-2] Extensions - {__lib__}: Created 29 enemies
12:49:33,663 INFO [pool-1-thread-2] Extensions - {__lib__}: Called activate node: 11
12:49:33,663 INFO [pool-1-thread-2] Extensions - {__lib__}: Created 24 enemies
12:49:38,772 INFO [pool-1-thread-3] Extensions - {__lib__}: Called DEACTIVATE node: 10
12:49:38,773 INFO [pool-1-thread-3] Extensions - {RoomExtension}: An error occurred in SimulationTask: Cannot invoke "Object.hashCode()" because "<parameter1>" is null
java.lang.NullPointerException: Cannot invoke "Object.hashCode()" because "<parameter1>" is null
at java.base/java.util.concurrent.ConcurrentHashMap.get(Unknown Source)
at com.smartfoxserver.v2.mmo.MMOItemManager.removeItem(MMOItemManager.java:152)
at com.smartfoxserver.v2.mmo.MMORoom.removeMMOItem(MMORoom.java:228)
at com.smartfoxserver.v2.api.SFSMMOApi.removeMMOItem(SFSMMOApi.java:169)
at data.world.spawner.EnemySpawner.Deactivate(EnemySpawner.java:370)
at manager.NodeManager.DeactivateNode(NodeManager.java:260)
at manager.NodeManager.DecrementNodeUserCount(NodeManager.java:230)
at manager.NodeManager.SetUserPosition(NodeManager.java:151)
at manager.MovementManager.ProcessInput(MovementManager.java:185)
at manager.SimulationManager$SimulationTask.run(SimulationManager.java:710)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.base/java.util.concurrent.FutureTask.runAndReset(Unknown Source)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)Thanks and cheers.