add experimental npcs
All checks were successful
/ Auto-Build-App (push) Successful in 1m55s

This commit is contained in:
pietru 2025-03-16 17:43:27 +01:00
parent cc69e49a20
commit 1b05bf2ed1
3 changed files with 230 additions and 0 deletions

View file

@ -21,6 +21,7 @@ import finalforeach.cosmicreach.world.IZoneLoader;
import finalforeach.cosmicreach.world.Zone;
import finalforeach.cosmicreach.worldgen.ZoneGenerator;
import io.netty.channel.ChannelHandlerContext;
import net.pietru.cookie_utils.npcs.NpcDef;
import net.pietru.cookie_utils.permissions.GroupPerms;
import net.pietru.cookie_utils.permissions.Permissions;
import net.pietru.cookie_utils.setups.Setup;
@ -246,6 +247,88 @@ public class TextCommands {
packet.setupAndSend(channelHandlerContext);
});
commands.put("npc",(args, networkIdentity, channelHandlerContext) -> {
Player plr = networkIdentity.getPlayer();
MessagePacket packet = new MessagePacket("[Server] Usage :npc action id values(optional)");
if (args.length>=4) {
String arg2 = args[2];
String arg3 = args[3];
switch (args[1]) {
case "name":
try {
NpcDef.registered_npc_list.get(Integer.parseInt(arg2)).change_zone(plr.getZone()).setName(arg3);
packet.message="[Server] Changed npc with ID: %s, NAME: %s".formatted(arg2,arg3);
} catch (Exception ignored){
packet.message="[Server] Failed to modify npc ID: %s".formatted(arg2);
}
break;
case "rot":
try {
String[] ps = arg3.split(":");
NpcDef.registered_npc_list.get(Integer.parseInt(arg2))
.change_view_dir(new Vector3(
Float.parseFloat(ps[0]),
Float.parseFloat(ps[1]),
Float.parseFloat(ps[2])
)).send_update();
packet.message="[Server] Rotated npc with ID: %s".formatted(arg2);
} catch (Exception ignored){
packet.message="[Server] Failed to modify npc ID: %s".formatted(arg2);
}
break;
}
} else if (args.length==3) {
String arg2 = args[2];
switch (args[1]) {
case "add":
new NpcDef(arg2, plr.getPosition(), plr.getZone()).register().show_npc();
packet.message="[Server] Added npc with ID: %s".formatted(NpcDef.registered_npc_list.size()-1);
break;
case "tphere":
try {
NpcDef.registered_npc_list.get(Integer.parseInt(arg2))
.change_zone(plr.getZone())
.change_position(plr.getPosition())
.send_update();
packet.message="[Server] Moved npc with ID: %s".formatted(arg2);
} catch (Exception ignored){
packet.message="[Server] Failed to parse npc ID: %s".formatted(arg2);
}
break;
case "myrot":
try {
NpcDef.registered_npc_list.get(Integer.parseInt(arg2))
.change_view_dir(plr.getEntity().viewDirection)
.send_update();
packet.message="[Server] Rotated npc with ID: %s".formatted(arg2);
} catch (Exception ignored){
packet.message="[Server] Failed to parse npc ID: %s".formatted(arg2);
}
break;
case "remove", "del":
try {
NpcDef.registered_npc_list.get(Integer.parseInt(arg2)).unregister();
packet.message="[Server] Removed npc with ID: %s".formatted(arg2);
} catch (Exception ignored){
packet.message="[Server] Failed to parse npc ID: %s".formatted(arg2);
}
break;
}
} else if (args.length == 2) {
switch (args[1]) {
case "list":
StringBuilder msg = new StringBuilder("[Server] NPC List:\n");
for (int i = 0; i < NpcDef.registered_npc_list.size(); i++) {
msg.append(" - ID: %d | Name: %s \n".formatted(i, NpcDef.registered_npc_list.get(i).getName()));
}
packet.message=msg.toString();
break;
}
}
packet.setupAndSend(channelHandlerContext);
});
commands.put("make_zone",(args, networkIdentity, channelHandlerContext) -> {
boolean created = false;
ArrayList<String> zones;

View file

@ -3,8 +3,11 @@ package net.pietru.cookie_utils.mixins;
import com.llamalad7.mixinextras.sugar.Local;
import finalforeach.cosmicreach.accounts.Account;
import finalforeach.cosmicreach.networking.NetworkIdentity;
import finalforeach.cosmicreach.networking.packets.entities.PlayerPacket;
import finalforeach.cosmicreach.networking.packets.meta.LoginPacket;
import finalforeach.cosmicreach.networking.server.ServerSingletons;
import io.netty.channel.ChannelHandlerContext;
import net.pietru.cookie_utils.npcs.NpcDef;
import net.pietru.cookie_utils.utils.player_utils;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
@ -24,6 +27,10 @@ public class LoginPacketMixin {
if (is_plr_valid(account.getUniqueId())){
player_utils.usernames_to_ids.put(account.getUsername(), account.getUniqueId());
player_utils.plr_last_area.put(account.getUniqueId(),"");
for (NpcDef def : NpcDef.registered_npc_list){
def.send_to(ctx);
}
}
}
}

View file

@ -0,0 +1,140 @@
package net.pietru.cookie_utils.npcs;
import com.badlogic.gdx.math.Vector3;
import finalforeach.cosmicreach.accounts.AccountOffline;
import finalforeach.cosmicreach.entities.Entity;
import finalforeach.cosmicreach.entities.player.Player;
import finalforeach.cosmicreach.entities.player.PlayerEntity;
import finalforeach.cosmicreach.networking.packets.entities.PlayerPacket;
import finalforeach.cosmicreach.networking.packets.entities.PlayerPositionPacket;
import finalforeach.cosmicreach.networking.packets.meta.RemovedPlayerPacket;
import finalforeach.cosmicreach.networking.server.ServerSingletons;
import finalforeach.cosmicreach.world.Zone;
import io.netty.channel.ChannelHandlerContext;
import java.util.ArrayList;
public class NpcDef {
public final static ArrayList<NpcDef> registered_npc_list = new ArrayList<>();
AccountOffline account;
Player player;
PlayerEntity playerEntity;
Zone zone;
boolean added = false;
public NpcDef(String npc_name, Vector3 position, Zone zone){
this.zone=zone;
account = new AccountOffline();
account.setDisplayName(npc_name);
player=new Player();
playerEntity=new PlayerEntity(player);
player.setEntity(playerEntity);
playerEntity.setPosition(position);
playerEntity.gravityModifier=0F;
//playerEntity.setNoClip(true);
}
public String getName(){
return account.getDisplayName();
}
public NpcDef setName(String npc_name){
account.setDisplayName(npc_name);
if (added) {
hide_npc();
show_npc();
}
return this;
}
public NpcDef register(){
if (!registered_npc_list.contains(this))
registered_npc_list.add(this);
return this;
}
public NpcDef unregister(){
registered_npc_list.remove(this);
hide_npc();
return this;
}
public NpcDef change_position(Vector3 position){
playerEntity.setPosition(position);
return this;
}
public NpcDef change_view_dir(Vector3 dir){
playerEntity.viewDirection=dir;
return this;
}
public NpcDef send_update(){
PlayerPositionPacket packet = new PlayerPositionPacket(player);
packet.playerUniqueId = account.getUniqueId();
Entity e = player.getEntity();
packet.position.set(e.getPosition());
packet.viewDir.set(e.viewDirection);
packet.viewDirOff.set(e.viewPositionOffset);
packet.zoneId = player.zoneId;
packet.playerFlags = 0;
addFlag(packet, PlayerPositionPacket.PLAYER_FLAG_SNEAKING, e.isSneaking());
addFlag(packet, PlayerPositionPacket.PLAYER_FLAG_SPRINTING, player.isSprinting);
ServerSingletons.SERVER.broadcastToAll(packet);
return this;
}
private void addFlag(PlayerPositionPacket packet, int flagMask, boolean flagValue) {
if (flagValue) {
packet.playerFlags |= flagMask;
} else {
packet.playerFlags &= ~flagMask;
}
}
public NpcDef change_zone(Zone zone){
if (zone.equals(this.zone) || !added) {
this.zone = zone;
return this;
}
player.zoneId=zone.zoneId;
this.zone.removeEntity(playerEntity);
this.zone=zone;
zone.addEntity(playerEntity);
return this;
}
public NpcDef send_to(ChannelHandlerContext ctx){
if (added){
PlayerPacket packet = new PlayerPacket(account,player,false);
packet.setupAndSend(ctx);
}
return this;
}
public NpcDef show_npc(){
player.zoneId=zone.zoneId;
PlayerPacket packet = new PlayerPacket(account,player,false);
ServerSingletons.SERVER.broadcastToAll(packet);
zone.addEntity(playerEntity);
added=true;
return this;
}
public NpcDef hide_npc(){
RemovedPlayerPacket packet = new RemovedPlayerPacket(account);
ServerSingletons.SERVER.broadcastToAll(packet);
added=false;
zone.removeEntity(playerEntity);
return this;
}
}