Renderer/src/main/java/electrosphere/server/player/PlayerActions.java
austin a530a7242a
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
bush harvesting
2025-04-04 19:36:29 -04:00

139 lines
6.2 KiB
Java

package electrosphere.server.player;
import org.joml.Vector3d;
import org.joml.Vector3i;
import electrosphere.client.item.ItemActions;
import electrosphere.engine.Globals;
import electrosphere.entity.Entity;
import electrosphere.entity.state.block.ServerBlockTree;
import electrosphere.entity.state.equip.ServerToolbarState;
import electrosphere.entity.state.life.ServerLifeTree;
import electrosphere.entity.types.common.CommonEntityUtils;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.game.data.common.interact.InteractionData;
import electrosphere.game.data.creature.type.CreatureData;
import electrosphere.game.data.creature.type.block.BlockVariant;
import electrosphere.game.data.item.Item;
import electrosphere.game.data.item.ItemUsage;
import electrosphere.game.server.world.ServerWorldData;
import electrosphere.logger.LoggerInterface;
import electrosphere.net.parser.net.message.InventoryMessage;
import electrosphere.net.server.ServerConnectionHandler;
import electrosphere.server.block.editing.ServerBlockEditing;
import electrosphere.server.datacell.Realm;
import electrosphere.server.datacell.utils.EntityLookupUtils;
import electrosphere.server.utils.ServerScriptUtils;
/**
* Class for handling
*/
public class PlayerActions {
/**
* Attempts to perform an action a player requested
* @param connectionHandler The player's connection handler
* @param message The network message that encapsulates the requested action
*/
public static void attemptPlayerAction(ServerConnectionHandler connectionHandler, InventoryMessage message){
Entity playerEntity = EntityLookupUtils.getEntityById(connectionHandler.getPlayerEntityId());
if(message.getitemActionCode() == ItemActions.ITEM_ACTION_CODE_SECONDARY){
ServerToolbarState serverToolbarState = ServerToolbarState.getServerToolbarState(playerEntity);
if(serverToolbarState != null && serverToolbarState.getRealWorldItem() != null){
Item item = Globals.gameConfigCurrent.getItemMap().getItem(serverToolbarState.getRealWorldItem());
CreatureData creatureData = Globals.gameConfigCurrent.getCreatureTypeLoader().getType(CreatureUtils.getType(playerEntity));
ServerBlockTree serverBlockTree = ServerBlockTree.getServerBlockTree(playerEntity);
//check block status
boolean shouldBlock = false;
if(creatureData.getBlockSystem() != null && creatureData.getBlockSystem().getAllVariants() != null && serverBlockTree != null){
for(BlockVariant variant : creatureData.getBlockSystem().getAllVariants()){
if(variant.getVariantId().equals(serverBlockTree.getCurrentBlockVariant())){
shouldBlock = true;
break;
}
}
}
//actually perform actions
if(shouldBlock){
PlayerActions.block(playerEntity, message);
} else if(item.getSecondaryUsage() != null){
PlayerActions.secondaryUsage(playerEntity, item, message);
}
}
}
}
/**
* Attempts to block
*/
private static void block(Entity playerEntity, InventoryMessage message){
ServerBlockTree serverBlockTree = ServerBlockTree.getServerBlockTree(playerEntity);
if(serverBlockTree != null){
if(message.getitemActionCodeState() == ItemActions.ITEM_ACTION_CODE_STATE_ON){
serverBlockTree.start();
} else {
serverBlockTree.stop();
}
}
}
/**
* Performs various secondary usages
* @param playerEntity The player's entity
* @param item The item data
* @param message The message
*/
private static void secondaryUsage(Entity playerEntity, Item item, InventoryMessage message){
ItemUsage secondaryUsage = item.getSecondaryUsage();
Realm playerRealm = Globals.realmManager.getEntityRealm(playerEntity);
//entity spawning
if(secondaryUsage.getSpawnEntityId() != null){
Vector3d spawnPos = new Vector3d(message.getviewTargetX(),message.getviewTargetY(),message.getviewTargetZ());
CommonEntityUtils.serverSpawnBasicObject(playerRealm, spawnPos, secondaryUsage.getSpawnEntityId());
}
//voxel block editing
if(secondaryUsage.getBlockId() != null){
ServerWorldData serverWorldData = playerRealm.getServerWorldData();
//clamp the placement pos to the block grid..
Vector3d placementPos = new Vector3d(message.getviewTargetX(),message.getviewTargetY(),message.getviewTargetZ());
Vector3i worldPos = serverWorldData.convertRealToWorldSpace(placementPos);
Vector3i blockPos = serverWorldData.convertRealToLocalBlockSpace(placementPos);
//actually edit
ServerBlockEditing.editBlockChunk(playerRealm, worldPos, blockPos, (short)(int)secondaryUsage.getBlockId(), (short)0);
LoggerInterface.loggerEngine.DEBUG("Place block type " + secondaryUsage.getBlockId() + " at " + placementPos + " -> " + worldPos + " " + blockPos);
}
}
/**
* Attempts to perform an action a player requested
* @param connectionHandler The player's connection handler
* @param target The target if the interaction
* @param signal The type of interaction
*/
public static void attemptInteraction(ServerConnectionHandler connectionHandler, Entity target, String signal){
Entity playerEntity = EntityLookupUtils.getEntityById(connectionHandler.getPlayerEntityId());
switch(signal){
case InteractionData.ON_INTERACT_HARVEST: {
if(ServerLifeTree.hasServerLifeTree(target)){
ServerLifeTree serverLifeTree = ServerLifeTree.getServerLifeTree(target);
serverLifeTree.kill();
}
ServerScriptUtils.fireSignalOnEntity(playerEntity, "entityInteractHarvest", target);
} break;
default: {
throw new Error("Unsupported signal received! " + signal);
}
}
}
}