Renderer/src/test/java/electrosphere/entity/state/equip/ClientEquipStateTests.java
austin d56d08204c
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
creature template to object template
2025-05-11 15:47:31 -04:00

148 lines
6.2 KiB
Java

package electrosphere.entity.state.equip;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.Set;
import org.joml.Vector3d;
import org.junit.jupiter.api.Disabled;
import electrosphere.test.annotations.IntegrationTest;
import electrosphere.engine.Globals;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityTags;
import electrosphere.entity.state.attach.AttachUtils;
import electrosphere.entity.state.inventory.InventoryUtils;
import electrosphere.entity.state.inventory.UnrelationalInventoryState;
import electrosphere.entity.types.creature.ObjectTemplate;
import electrosphere.entity.types.EntityTypes.EntityType;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.entity.types.item.ItemUtils;
import electrosphere.test.template.EntityTestTemplate;
import electrosphere.test.testutils.TestEngineUtils;
import electrosphere.test.testutils.TestViewportUtils;
/**
* Tests for client side equip state
*/
public class ClientEquipStateTests extends EntityTestTemplate {
/**
* Make sure server notifies client if ANY item is equipped
*/
@IntegrationTest
@Disabled
public void testClientEquipItem(){
//warm up engine
TestEngineUtils.simulateFrames(1);
//spawn entities
ObjectTemplate creatureTemplate = ObjectTemplate.createDefault(EntityType.CREATURE, "human");
Entity creature = CreatureUtils.serverSpawnBasicCreature(Globals.realmManager.first(), new Vector3d(0,0,0), "human", creatureTemplate);
Entity katana = ItemUtils.serverSpawnBasicItem(Globals.realmManager.first(), new Vector3d(0,0,0), "Katana2H");
//wait for entities to propagate to client
TestEngineUtils.simulateFrames(5);
//verify the client got the extra entities
Set<Entity> clientSideCreatures = Globals.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE);
assertEquals(1, clientSideCreatures.size());
Set<Entity> clientSideItems = Globals.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM);
assertEquals(1, clientSideItems.size());
//equip
Entity inInventoryItem = InventoryUtils.serverAttemptStoreItemTransform(creature, katana);
ServerEquipState serverEquipState = ServerEquipState.getServerEquipState(creature);
serverEquipState.commandAttemptEquip(inInventoryItem, serverEquipState.getEquipPoint("handsCombined"));
//propagate to client
TestEngineUtils.simulateFrames(2);
//verify we still have everything
clientSideCreatures = Globals.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE);
assertEquals(1, clientSideCreatures.size());
clientSideItems = Globals.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM);
assertEquals(1, clientSideItems.size());
//grab the item in particular
Entity child = clientSideItems.iterator().next();
//
//verify was equipped
assertTrue(ItemUtils.isItem(child));
assertTrue(ItemUtils.isWeapon(child));
assertNotNull(AttachUtils.getParent(child));
Entity parentOfChild = AttachUtils.getParent(child);
assertTrue(CreatureUtils.isCreature(parentOfChild));
assertNotNull(AttachUtils.getChildrenList(parentOfChild));
assertEquals(1, AttachUtils.getChildrenList(parentOfChild).size());
}
/**
* Try requesting that an item is equipped from the client
*/
@IntegrationTest
@Disabled
public void testClientPlayerRequestEquip(){
//warm up engine
TestEngineUtils.simulateFrames(1);
//spawn entities
TestViewportUtils.spawnPlayerCharacter("human");
//TODO: associate creature with player object created for viewport
ItemUtils.serverSpawnBasicItem(Globals.realmManager.first(), new Vector3d(0,0,0), "Katana2H");
//wait for entities to propagate to client
TestEngineUtils.simulateFrames(5);
//verify the client got the extra entities
Set<Entity> clientSideCreatures = Globals.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE);
assertEquals(1, clientSideCreatures.size());
Set<Entity> clientSideItems = Globals.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM);
assertEquals(1, clientSideItems.size());
//try to store item in inventory
Entity katanaOnClient = clientSideItems.iterator().next();
InventoryUtils.clientAttemptStoreItem(Globals.playerEntity, katanaOnClient);
//wait for server to perform transform
TestEngineUtils.simulateFrames(5);
//try equipping
UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerEntity);
assertEquals(1, inventory.getItems().size());
Entity inInventoryItem = inventory.getItems().get(0);
ClientEquipState clientEquipState = ClientEquipState.getClientEquipState(Globals.playerEntity);
clientEquipState.commandAttemptEquip(inInventoryItem, clientEquipState.getEquipPoint("handsCombined"));
//propagate to client
TestEngineUtils.simulateFrames(5);
//verify we still have everything
clientSideCreatures = Globals.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE);
assertEquals(1, clientSideCreatures.size());
clientSideItems = Globals.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM);
assertEquals(2, clientSideItems.size());
//verify the equip state thinks it has something equipped
assertEquals(1,clientEquipState.getEquippedPoints().size());
//grab the item in particular
Entity child = clientEquipState.getEquippedItemAtPoint("handsCombined");
//
//verify was equipped
assertTrue(ItemUtils.isItem(child));
assertTrue(ItemUtils.isWeapon(child));
assertNotNull(AttachUtils.getParent(child));
Entity parentOfChild = AttachUtils.getParent(child);
assertNotNull(AttachUtils.getChildrenList(parentOfChild));
assertEquals(1, AttachUtils.getChildrenList(parentOfChild).size());
}
}