fix and improve camera system

This commit is contained in:
Sen 2025-08-07 02:17:59 +02:00
parent a76c0c66e1
commit 72dc4a1305
Signed by: sen
GPG key ID: 3AC50A6F47D1B722
15 changed files with 180 additions and 108 deletions

View file

@ -111,9 +111,10 @@ import common.effect.StatusEffect;
import common.entity.Entity; import common.entity.Entity;
import common.entity.animal.EntityHorse; import common.entity.animal.EntityHorse;
import common.entity.item.EntityCamera; import common.entity.item.EntityCamera;
import common.entity.item.EntityCamera.CameraType;
import common.entity.item.EntityCart; import common.entity.item.EntityCart;
import common.entity.npc.Energy; import common.entity.npc.Energy;
import common.entity.npc.EntityCpu; import common.entity.npc.EntityCameraHolder;
import common.entity.npc.EntityNPC; import common.entity.npc.EntityNPC;
import common.entity.npc.EntityWaterNPC; import common.entity.npc.EntityWaterNPC;
import common.entity.npc.PlayerCharacter; import common.entity.npc.PlayerCharacter;
@ -431,6 +432,7 @@ public class Client implements IThreadListener {
public boolean charEditor; public boolean charEditor;
public boolean fullscreen; public boolean fullscreen;
public boolean interrupted; public boolean interrupted;
public boolean freecam;
private int leftClickCounter; private int leftClickCounter;
private int rightClickTimer; private int rightClickTimer;
@ -717,7 +719,7 @@ public class Client implements IThreadListener {
this.dimensionName = "debug"; this.dimensionName = "debug";
Space.INSTANCE.setDisplay("Debug-Welt"); Space.INSTANCE.setDisplay("Debug-Welt");
this.controller = new PlayerController(this, player); this.controller = new PlayerController(this, player);
this.loadWorld(Space.INSTANCE, EntityRegistry.getEntityID(EntityCpu.class)); this.loadWorld(Space.INSTANCE, EntityRegistry.getEntityID(EntityCameraHolder.class));
this.player.setId(0); this.player.setId(0);
this.show(null); this.show(null);
this.player.flying = true; this.player.flying = true;
@ -737,6 +739,7 @@ public class Client implements IThreadListener {
this.debugWorld = false; this.debugWorld = false;
this.charEditor = false; this.charEditor = false;
this.viewEntity = null; this.viewEntity = null;
this.freecam = false;
this.connection = null; this.connection = null;
this.world = null; this.world = null;
this.resetWorld(); this.resetWorld();
@ -1644,6 +1647,7 @@ public class Client implements IThreadListener {
{ {
this.resetWorld(); this.resetWorld();
this.viewEntity = null; this.viewEntity = null;
this.freecam = false;
this.connection = null; this.connection = null;
this.soundManager.stopSounds(); this.soundManager.stopSounds();
this.world = new WorldClient(dim); this.world = new WorldClient(dim);
@ -1691,6 +1695,7 @@ public class Client implements IThreadListener {
this.player = this.controller.createPlayerEntity(this.world, type); this.player = this.controller.createPlayerEntity(this.world, type);
this.player.getDataWatcher().updateWatchedObjectsFromList(entityplayersp.getDataWatcher().getAllWatched()); this.player.getDataWatcher().updateWatchedObjectsFromList(entityplayersp.getDataWatcher().getAllWatched());
this.viewEntity = this.player; this.viewEntity = this.player;
this.freecam = false;
this.player.preparePlayerToSpawn(); this.player.preparePlayerToSpawn();
this.spawnEntity(this.player); this.spawnEntity(this.player);
this.player.rotYaw = -180.0F; this.player.rotYaw = -180.0F;
@ -1750,6 +1755,7 @@ public class Client implements IThreadListener {
public void setRenderViewEntity(Entity viewingEntity) public void setRenderViewEntity(Entity viewingEntity)
{ {
this.viewEntity = viewingEntity; this.viewEntity = viewingEntity;
this.freecam = false;
} }
public void schedule(Runnable task) { public void schedule(Runnable task) {
@ -1838,8 +1844,12 @@ public class Client implements IThreadListener {
if(this.viewEntity instanceof EntityCamera camera) { if(this.viewEntity instanceof EntityCamera camera) {
camera.onUpdate(); camera.onUpdate();
camera.setMovement(this.moveStrafe, this.moveForward, this.jump, this.sneak); camera.setMovement(this.moveStrafe, this.moveForward, this.jump, this.sneak);
if(!this.freecam) {
this.getNetHandler().addToSendQueue(new CPacketInput(this.moveStrafe, this.moveForward, this.jump, this.sneak, true)); this.getNetHandler().addToSendQueue(new CPacketInput(this.moveStrafe, this.moveForward, this.jump, this.sneak, true));
this.getNetHandler().addToSendQueue(new CPacketPlayerPosLook(camera.posX, camera.posY, camera.posZ, camera.rotYaw, camera.rotPitch, this.sprint).setCamera()); this.getNetHandler().addToSendQueue(new CPacketPlayerPosLook(camera.posX, camera.posY, camera.posZ, camera.rotYaw, camera.rotPitch, this.sprint).setCamera());
if(this.player != null)
this.player.setPositionAndRotation(camera.posX, camera.posY, camera.posZ, camera.rotYaw, camera.rotPitch);
}
// if(!camera.fixed && this.sprint) // if(!camera.fixed && this.sprint)
// this.viewEntity = this.player; // this.viewEntity = this.player;
} }
@ -2723,6 +2733,16 @@ public class Client implements IThreadListener {
} }
} }
}); });
if(Util.DEVMODE)
this.registerDebug(Keysym.SPACE, "Kamera umschalten", new DebugRunner() {
public void execute(Keysym key) {
if(Client.this.world != null && Client.this.player != null) {
Client.this.viewEntity = Client.this.viewEntity == Client.this.player ? new EntityCamera(Client.this.world,
Client.this.player.posX, Client.this.player.posY, Client.this.player.posZ, Client.this.player.rotYaw, Client.this.player.rotPitch, 256, 2.5f, CameraType.FREE, false) : Client.this.player;
Client.this.freecam = Client.this.viewEntity != Client.this.player;
}
}
});
if(Util.DEVMODE) if(Util.DEVMODE)
this.registerDebug(Keysym.AE, "Programm sofort beenden und server beenden", new DebugRunner() { this.registerDebug(Keysym.AE, "Programm sofort beenden und server beenden", new DebugRunner() {
public void execute(Keysym key) { public void execute(Keysym key) {

View file

@ -11,6 +11,7 @@ import client.gui.element.PressType;
import client.gui.options.GuiOptions; import client.gui.options.GuiOptions;
import client.renderer.Drawing; import client.renderer.Drawing;
import client.window.Keysym; import client.window.Keysym;
import common.entity.npc.EntityCameraHolder;
import common.rng.Random; import common.rng.Random;
import common.util.ExtMath; import common.util.ExtMath;
import common.util.Color; import common.util.Color;
@ -112,7 +113,7 @@ public class GuiMenu extends Gui {
this.add(new NavButton(0, 0, 180, 0, this.gm.charEditor ? GuiChar.INSTANCE : null, this.gm.charEditor ? "Zurück zum Editor" : "Zurück zum Spiel")); this.add(new NavButton(0, 0, 180, 0, this.gm.charEditor ? GuiChar.INSTANCE : null, this.gm.charEditor ? "Zurück zum Editor" : "Zurück zum Spiel"));
this.add(new NavButton(0, 20, 180, 0, GuiOptions.getPage(), "Einstellungen")); this.add(new NavButton(0, 20, 180, 0, GuiOptions.getPage(), "Einstellungen"));
if(!this.gm.charEditor) if(!this.gm.charEditor)
this.add(new NavButton(0, 40, 180, 0, GuiCharacters.INSTANCE, "Charakter")); this.add(new NavButton(0, 40, 180, 0, GuiCharacters.INSTANCE, "Charakter")).enabled = !(this.gm.player instanceof EntityCameraHolder);
this.add(new ActButton(0, this.gm.charEditor ? 50 : 70, 180, 0, new ButtonCallback() { this.add(new ActButton(0, this.gm.charEditor ? 50 : 70, 180, 0, new ButtonCallback() {
public void use(ActButton elem, PressType action) { public void use(ActButton elem, PressType action) {
GuiMenu.this.gm.unload(true); GuiMenu.this.gm.unload(true);

View file

@ -9,6 +9,7 @@ import client.renderer.entity.RenderBat;
import client.renderer.entity.RenderBlockEntity; import client.renderer.entity.RenderBlockEntity;
import client.renderer.entity.RenderBoat; import client.renderer.entity.RenderBoat;
import client.renderer.entity.RenderBullet; import client.renderer.entity.RenderBullet;
import client.renderer.entity.RenderCamera;
import client.renderer.entity.RenderChicken; import client.renderer.entity.RenderChicken;
import client.renderer.entity.RenderCow; import client.renderer.entity.RenderCow;
import client.renderer.entity.RenderCrystal; import client.renderer.entity.RenderCrystal;
@ -85,6 +86,7 @@ import common.entity.item.EntityOrb;
import common.entity.item.EntityTnt; import common.entity.item.EntityTnt;
import common.entity.item.EntityTntCart; import common.entity.item.EntityTntCart;
import common.entity.item.EntityXp; import common.entity.item.EntityXp;
import common.entity.npc.EntityCameraHolder;
import common.entity.npc.SpeciesInfo; import common.entity.npc.SpeciesInfo;
import common.entity.projectile.EntityArrow; import common.entity.projectile.EntityArrow;
import common.entity.projectile.EntityBox; import common.entity.projectile.EntityBox;
@ -150,6 +152,7 @@ public abstract class RenderRegistry {
models.put(ModelType.DWARF, new RenderHumanoid(mgr, 10, 10, "textures/npc/dwarf.png")); models.put(ModelType.DWARF, new RenderHumanoid(mgr, 10, 10, "textures/npc/dwarf.png"));
models.put(ModelType.HALFLING, new RenderHumanoid(mgr, 8, 8, "textures/npc/goblin.png")); models.put(ModelType.HALFLING, new RenderHumanoid(mgr, 8, 8, "textures/npc/goblin.png"));
models.put(ModelType.SPACE_MARINE, new RenderSpaceMarine(mgr)); models.put(ModelType.SPACE_MARINE, new RenderSpaceMarine(mgr));
map.put(EntityCameraHolder.class, new RenderCamera(mgr));
for(int z = 0; z < SpeciesRegistry.SPECIMEN.size(); z++) { for(int z = 0; z < SpeciesRegistry.SPECIMEN.size(); z++) {
SpeciesInfo info = SpeciesRegistry.SPECIMEN.get(z); SpeciesInfo info = SpeciesRegistry.SPECIMEN.get(z);
map.put(info.clazz, models.get(info.renderer)); map.put(info.clazz, models.get(info.renderer));

View file

@ -48,6 +48,7 @@ import common.collect.Sets;
import common.dimension.DimType; import common.dimension.DimType;
import common.effect.Effect; import common.effect.Effect;
import common.entity.Entity; import common.entity.Entity;
import common.entity.npc.EntityCameraHolder;
import common.entity.npc.EntityNPC; import common.entity.npc.EntityNPC;
import common.entity.types.EntityAnimal; import common.entity.types.EntityAnimal;
import common.entity.types.EntityLiving; import common.entity.types.EntityLiving;
@ -1280,7 +1281,7 @@ public class Renderer {
this.renderCloudsCheck(partialTicks); this.renderCloudsCheck(partialTicks);
} }
if (entity == this.gm.player) if (entity == this.gm.player && !(this.gm.player instanceof EntityCameraHolder))
{ {
GL11.glClear(256); GL11.glClear(256);
this.renderHand(partialTicks); this.renderHand(partialTicks);

View file

@ -0,0 +1,22 @@
package client.renderer.entity;
import common.entity.npc.EntityNPC;
public class RenderCamera extends RenderNpc {
public RenderCamera(RenderManager renderManagerIn) {
super(renderManagerIn, null);
}
public void doRender(EntityNPC entity, double x, double y, double z, float partialTicks) {
}
public String getDefaultTexture() {
return null;
}
public void getSegments(TexList opaque, TexList alpha) {
}
public void getHeadUVs(CoordList list) {
}
}

View file

@ -1,5 +1,6 @@
package common.ai; package common.ai;
import common.entity.npc.EntityCameraHolder;
import common.entity.types.EntityLiving; import common.entity.types.EntityLiving;
import common.entity.types.IEntityOwnable; import common.entity.types.IEntityOwnable;
import common.pathfinding.PathEntity; import common.pathfinding.PathEntity;
@ -139,7 +140,7 @@ public abstract class EntityAITarget extends EntityAIBase
{ {
return false; return false;
} }
else if (!target.isEntityAlive()) else if (!target.isEntityAlive() || target instanceof EntityCameraHolder)
{ {
return false; return false;
} }

View file

@ -0,0 +1,44 @@
package common.entity.npc;
import common.entity.DamageSource;
import common.rng.Random;
import common.world.World;
public class EntityCameraHolder extends EntityNPC {
public EntityCameraHolder(World worldIn) {
super(worldIn);
}
public int getBaseHealth(Random rand) {
return 1;
}
public Alignment getNaturalAlign() {
return Alignment.NEUTRAL;
}
public float getSpeciesBaseSize() {
return 0.1f;
}
public boolean isVisibleTo(EntityNPC player) {
return false;
}
public Object onInitialSpawn(Object livingdata) {
this.setCustomNameTag("Kamera");
this.setHeight(0.1f);
return livingdata;
}
public boolean canBeCollidedWith() {
return false;
}
public float getEyeHeight() {
return 0.0F;
}
protected void damageEntity(DamageSource damageSrc, int damageAmount) {
}
}

View file

@ -1,64 +0,0 @@
package common.entity.npc;
import common.init.Items;
import common.item.ItemStack;
import common.rng.Random;
import common.world.World;
public class EntityCpu extends EntityNPC {
public EntityCpu(World worldIn) {
super(worldIn);
}
// public boolean isAggressive() {
// return false;
// }
//
// public boolean isPeaceful() {
// return false;
// }
// public boolean isAggressive(Class<? extends EntityNPC> clazz) {
// return false;
// }
// public boolean isPeaceful(Class<? extends EntityNPC> clazz) {
// return false;
// }
// public boolean canInfight(Alignment align) {
// return false;
// }
//
// public boolean canMurder(Alignment align) {
// return false;
// }
public boolean canUseMagic() {
return true;
}
// public int getBaseEnergy(Random rand) {
// return Integer.MAX_VALUE;
// }
public int getBaseHealth(Random rand) {
return 1024;
}
// public float getHeightDeviation(Random rand) {
// return 0.0f;
// }
public Alignment getNaturalAlign() {
return Alignment.NEUTRAL;
}
public boolean isBreedingItem(ItemStack stack) {
return stack.getItem() == Items.nieh_fragment;
}
public float getSpeciesBaseSize() {
return 1.8f;
}
}

View file

@ -27,7 +27,7 @@ public class EntityMage extends EntityNPC
public void onLivingUpdate() public void onLivingUpdate()
{ {
if (!this.worldObj.client && !this.isPlayer()) if (!this.worldObj.client && !this.isPlayer() && !this.dummy)
{ {
if (this.drinking) if (this.drinking)
{ {

View file

@ -215,6 +215,7 @@ public abstract class EntityNPC extends EntityLiving implements IInventory
public IPlayer connection; public IPlayer connection;
public IClientPlayer client; public IClientPlayer client;
protected boolean slave; protected boolean slave;
protected boolean dummy;
protected InventoryWarpChest warpChest; protected InventoryWarpChest warpChest;
public ContainerPlayer inventoryContainer; public ContainerPlayer inventoryContainer;
@ -436,6 +437,11 @@ public abstract class EntityNPC extends EntityLiving implements IInventory
this.renderDistWeight = 10.0D; this.renderDistWeight = 10.0D;
} }
public final void setPlayerDummy(TagObject tag) {
this.dummy = true;
this.readTags(tag);
}
public final boolean isPlayer() { public final boolean isPlayer() {
return this.connection != null || this.slave; return this.connection != null || this.slave;
} }
@ -2487,7 +2493,7 @@ public abstract class EntityNPC extends EntityLiving implements IInventory
public ItemStack getHeldItem() public ItemStack getHeldItem()
{ {
return this.isPlayer() ? (this.getSelectedIndex() < 9 && this.getSelectedIndex() >= 0 ? this.getStackInSlot(this.getSelectedIndex()) : null) : this.heldItem; return this.isPlayer() || this.dummy ? (this.getSelectedIndex() < 9 && this.getSelectedIndex() >= 0 ? this.getStackInSlot(this.getSelectedIndex()) : null) : this.heldItem;
} }
public ItemStack[] getArmor() public ItemStack[] getArmor()
@ -2507,7 +2513,7 @@ public abstract class EntityNPC extends EntityLiving implements IInventory
public void setHeldItem(ItemStack stack) public void setHeldItem(ItemStack stack)
{ {
if(this.isPlayer()) { if(this.isPlayer() || this.dummy) {
this.setInventorySlotContents(this.getSelectedIndex(), stack); this.setInventorySlotContents(this.getSelectedIndex(), stack);
} }
else { else {
@ -3340,7 +3346,7 @@ public abstract class EntityNPC extends EntityLiving implements IInventory
// this.setCanPickUpLoot(true); // this.setCanPickUpLoot(true);
this.setCombatTask(); this.setCombatTask();
if(this.isPlayer()) { if(this.isPlayer() || this.dummy) {
// this.entityUniqueID = getOfflineUUID(this.user); // this.entityUniqueID = getOfflineUUID(this.user);
// this.sleeping = tagCompund.getBoolean("Sleeping"); // this.sleeping = tagCompund.getBoolean("Sleeping");
// this.sleepTimer = tagCompund.getShort("SleepTimer"); // this.sleepTimer = tagCompund.getShort("SleepTimer");
@ -3459,7 +3465,7 @@ public abstract class EntityNPC extends EntityLiving implements IInventory
if(this.skin != null) if(this.skin != null)
tag.setByteArray("Skin", this.skin); tag.setByteArray("Skin", this.skin);
if(this.isPlayer()) { if(this.isPlayer() || this.dummy) {
// tagCompound.setBoolean("Sleeping", this.sleeping); // tagCompound.setBoolean("Sleeping", this.sleeping);
// tagCompound.setShort("SleepTimer", (short)this.sleepTimer); // tagCompound.setShort("SleepTimer", (short)this.sleepTimer);
tag.setFloat("XpP", this.experience); tag.setFloat("XpP", this.experience);
@ -3511,7 +3517,7 @@ public abstract class EntityNPC extends EntityLiving implements IInventory
protected void damageArmor(int damage) protected void damageArmor(int damage)
{ {
if(this.isPlayer()) { if(this.isPlayer() || this.dummy) {
damage = damage / 4; damage = damage / 4;
if (damage < 1) if (damage < 1)
damage = 1; damage = 1;
@ -4027,7 +4033,7 @@ public abstract class EntityNPC extends EntityLiving implements IInventory
*/ */
protected int getExperiencePoints(EntityNPC player) protected int getExperiencePoints(EntityNPC player)
{ {
return this.isPlayer() ? 0 : this.worldObj.rand.range(2, 5); return this.isPlayer() || this.dummy ? 0 : this.worldObj.rand.range(2, 5);
} }
/** /**
@ -4168,6 +4174,7 @@ public abstract class EntityNPC extends EntityLiving implements IInventory
protected void dropFewItems(boolean wasRecentlyHit, int lootingModifier) protected void dropFewItems(boolean wasRecentlyHit, int lootingModifier)
{ {
if(!this.isPlayer()) { if(!this.isPlayer()) {
if(!this.dummy)
super.dropFewItems(wasRecentlyHit, lootingModifier); super.dropFewItems(wasRecentlyHit, lootingModifier);
this.dropEquipment(); this.dropEquipment();
} }
@ -4304,7 +4311,7 @@ public abstract class EntityNPC extends EntityLiving implements IInventory
} }
public boolean getCanSpawnHere() { public boolean getCanSpawnHere() {
return this.isPlayer() || super.getCanSpawnHere(); return this.isPlayer() || this.dummy || super.getCanSpawnHere();
} }
// npc overrides // npc overrides
@ -4321,7 +4328,7 @@ public abstract class EntityNPC extends EntityLiving implements IInventory
if(this.isPlayer()) if(this.isPlayer())
return; return;
ItemStack itemstack1 = this.getHeldItem(); ItemStack itemstack1 = this.getHeldItem();
if (itemstack1 != null) if (itemstack1 != null && !this.dummy)
{ {
this.entityDropItem(itemstack1, 0.0F); this.entityDropItem(itemstack1, 0.0F);
} }
@ -4429,7 +4436,7 @@ public abstract class EntityNPC extends EntityLiving implements IInventory
} }
protected boolean canRegenerateHealth() { protected boolean canRegenerateHealth() {
return this.isPlayer(); return this.isPlayer() || this.dummy;
} }
// END PLAYER // END PLAYER

View file

@ -29,6 +29,7 @@ import common.entity.item.EntityOrb;
import common.entity.item.EntityTnt; import common.entity.item.EntityTnt;
import common.entity.item.EntityTntCart; import common.entity.item.EntityTntCart;
import common.entity.item.EntityXp; import common.entity.item.EntityXp;
import common.entity.npc.EntityCameraHolder;
import common.entity.npc.SpeciesInfo; import common.entity.npc.SpeciesInfo;
import common.entity.projectile.EntityArrow; import common.entity.projectile.EntityArrow;
import common.entity.projectile.EntityBox; import common.entity.projectile.EntityBox;
@ -260,6 +261,7 @@ public abstract class EntityRegistry {
registerEntity("Bullet", EntityBullet.class, "Kugel"); registerEntity("Bullet", EntityBullet.class, "Kugel");
registerEggs(); registerEggs();
registerEntity("Camera", EntityCameraHolder.class, "Kamera");
for(ItemMobTemplate item : ItemMobTemplate.TEMPLATES) { for(ItemMobTemplate item : ItemMobTemplate.TEMPLATES) {
item.delegateSetDisplay(); item.delegateSetDisplay();

View file

@ -7,7 +7,7 @@ import common.collect.Maps;
import common.entity.npc.EntityArachnoid; import common.entity.npc.EntityArachnoid;
import common.entity.npc.EntityBloodElf; import common.entity.npc.EntityBloodElf;
import common.entity.npc.EntityChaosMarine; import common.entity.npc.EntityChaosMarine;
import common.entity.npc.EntityCpu; import common.entity.npc.EntityCameraHolder;
import common.entity.npc.EntityCultivator; import common.entity.npc.EntityCultivator;
import common.entity.npc.EntityDarkMage; import common.entity.npc.EntityDarkMage;
import common.entity.npc.EntityDwarf; import common.entity.npc.EntityDwarf;
@ -36,6 +36,7 @@ import common.entity.npc.SpeciesInfo;
public abstract class SpeciesRegistry { public abstract class SpeciesRegistry {
public static enum ModelType { public static enum ModelType {
CAMERA("camera", 0.1f, 0.1f, 16, 16, "Kamera"),
HUMANOID("humanoid", 0.6f, 1.8f, 64, 64, "Humanoid"), HUMANOID("humanoid", 0.6f, 1.8f, 64, 64, "Humanoid"),
ARACHNOID("arachnoid", 1.4f, 1.6f, 128, 64, "Arachnoidea"), ARACHNOID("arachnoid", 1.4f, 1.6f, 128, 64, "Arachnoidea"),
SLIME("slime", 1.0f, 1.0f, 64, 32, "Schleim"), SLIME("slime", 1.0f, 1.0f, 64, 32, "Schleim"),
@ -86,7 +87,7 @@ public abstract class SpeciesRegistry {
} }
static void register() { static void register() {
registerSpecies("Cpu", EntityCpu.class, null, "Test-NSC", 0x202020, 0x8000ff, "Troll:trollface", "Hacker"); new SpeciesInfo("Camera", EntityCameraHolder.class, null, false, null, "Kamera", ModelType.CAMERA, 0x202020, 0x8000ff);
registerSpecies("Cultivator", EntityCultivator.class, "nienrath", "Kultivator", 0x000000, 0xff0000, "Wei Wuxian", 0x000000, 0xff0000, registerSpecies("Cultivator", EntityCultivator.class, "nienrath", "Kultivator", 0x000000, 0xff0000, "Wei Wuxian", 0x000000, 0xff0000,
"Lan Wangji", 0xffffff, 0x80e0ff, "Jiang Cheng", 0x200000, 0xaf00ff, "Shen Qingqiu", 0xffffff, 0x80ff80, "Lan Wangji", 0xffffff, 0x80e0ff, "Jiang Cheng", 0x200000, 0xaf00ff, "Shen Qingqiu", 0xffffff, 0x80ff80,
"Luo Binghe", 0x600000, 0x000000); "Luo Binghe", 0x600000, 0x000000);

View file

@ -28,6 +28,6 @@ public class CommandCamera extends Command {
} }
public void exec(CommandEnvironment env, Executor exec, Vec3 position, Dimension dim, double yaw, double pitch, int radius, double speed, CameraType type, boolean fixed, Player player) { public void exec(CommandEnvironment env, Executor exec, Vec3 position, Dimension dim, double yaw, double pitch, int radius, double speed, CameraType type, boolean fixed, Player player) {
player.setCamera(position.xCoord, position.yCoord, position.zCoord, (float)yaw, (float)pitch, radius, (float)speed, type, fixed); player.setCamera(dim, position.xCoord, position.yCoord, position.zCoord, (float)yaw, (float)pitch, radius, (float)speed, type, fixed);
} }
} }

View file

@ -14,6 +14,6 @@ public class CommandNocam extends Command {
} }
public void exec(CommandEnvironment env, Executor exec, Player player) { public void exec(CommandEnvironment env, Executor exec, Player player) {
player.removeCamera(); player.unsetCamera();
} }
} }

View file

@ -24,6 +24,7 @@ import common.entity.item.EntityCamera.CameraType;
import common.entity.item.EntityItem; import common.entity.item.EntityItem;
import common.entity.item.EntityXp; import common.entity.item.EntityXp;
import common.entity.npc.Alignment; import common.entity.npc.Alignment;
import common.entity.npc.EntityCameraHolder;
import common.entity.npc.EntityHuman; import common.entity.npc.EntityHuman;
import common.entity.npc.EntityNPC; import common.entity.npc.EntityNPC;
import common.entity.npc.PlayerCharacter; import common.entity.npc.PlayerCharacter;
@ -164,6 +165,7 @@ public class Player extends User implements Executor, IPlayer
private int lastMoved; private int lastMoved;
private int pingKey; private int pingKey;
private int selected = -1; private int selected = -1;
private int lastSelected = -1;
private long lastPingTime = System.nanoTime() / 1000000L; private long lastPingTime = System.nanoTime() / 1000000L;
private int lastSentPingPacket; private int lastSentPingPacket;
private double lastPosX; private double lastPosX;
@ -217,6 +219,8 @@ public class Player extends User implements Executor, IPlayer
private Executor forcedExec; private Executor forcedExec;
private Position deathPos; private Position deathPos;
private Position teleportPos; private Position teleportPos;
private Position lastDeathPos;
private Position lastTeleportPos;
private EntityCamera camera; private EntityCamera camera;
public Player(Server server, NetConnection connection, String user) public Player(Server server, NetConnection connection, String user)
@ -359,16 +363,39 @@ public class Player extends User implements Executor, IPlayer
public void setCamera(double x, double y, double z, float yaw, float pitch, int radius, float speed, CameraType type, boolean fixed) { public boolean setCamera(Dimension dim, double x, double y, double z, float yaw, float pitch, int radius, float speed, CameraType type, boolean fixed) {
if(this.charEditor || this.characters.isEmpty() || this.selected < 0 || this.lastSelected >= 0)
return false;
this.lastDeathPos = this.deathPos;
this.lastTeleportPos = this.teleportPos;
String name = this.entity.getCustomNameTag();
TagObject tag = this.server.swapPlayer(this, null, EntityCameraHolder.class);
this.characters.set(this.selected, tag);
this.lastSelected = this.selected;
this.selected = this.characters.size();
this.characters.add(new TagObject());
WorldServer world = this.server.getWorld(dim);
world = world == null ? this.server.getSpace() : world;
this.entity.teleport(x, y, z, yaw, pitch, world);
this.entity.setNoclip(true);
this.entity.setCustomNameTag("Kamera von " + name);
this.teleportPos = this.deathPos = null;
this.camera = new EntityCamera(this.entity.worldObj, x, y, z, yaw, pitch, radius, speed, type, fixed); this.camera = new EntityCamera(this.entity.worldObj, x, y, z, yaw, pitch, radius, speed, type, fixed);
this.sendPacket(new SPacketCamera(this.camera)); this.sendPacket(new SPacketCamera(this.camera));
return true;
} }
public void removeCamera() { public boolean unsetCamera() {
if(this.camera != null) { if(this.charEditor || this.lastSelected >= this.characters.size() || this.lastSelected < 0)
return false;
this.server.swapPlayer(this, this.characters.get(this.selected = this.lastSelected), null);
this.characters.removeLast();
this.lastSelected = -1;
this.deathPos = this.lastDeathPos;
this.teleportPos = this.lastTeleportPos;
this.camera = null; this.camera = null;
this.sendPacket(new SPacketCamera(null)); this.sendPacket(new SPacketCamera(null));
} return true;
} }
@ -626,11 +653,13 @@ public class Player extends User implements Executor, IPlayer
public void writeTags(TagObject tag) { public void writeTags(TagObject tag) {
if(!this.characters.isEmpty()) { if(!this.characters.isEmpty()) {
tag.setInt("selected", this.selected); tag.setInt("selected", this.lastSelected >= 0 ? this.lastSelected : this.selected);
List<TagObject> list = Lists.newArrayList(); List<TagObject> list = Lists.newArrayList();
for(TagObject etag : this.characters) { for(TagObject etag : this.characters) {
list.add(etag); list.add(etag);
} }
if(this.lastSelected >= 0)
list.removeLast();
tag.setList("characters", list); tag.setList("characters", list);
} }
} }
@ -653,14 +682,17 @@ public class Player extends User implements Executor, IPlayer
public void travelToDimension(Dimension dimensionId, BlockPos pos, float yaw, float pitch, PortalType portal) public void travelToDimension(Dimension dimensionId, BlockPos pos, float yaw, float pitch, PortalType portal)
{ {
if(this.camera != null)
return;
this.server.transferToDimension(this.entity, dimensionId, pos, yaw, pitch, portal); this.server.transferToDimension(this.entity, dimensionId, pos, yaw, pitch, portal);
this.lastExperience = -1; this.lastExperience = -1;
this.lastHealth = -1.0F; this.lastHealth = -1.0F;
} }
public void teleport(double x, double y, double z, float yaw, float pitch, Dimension dimension) { public void teleport(double x, double y, double z, float yaw, float pitch, Dimension dimension) {
if(this.camera != null)
this.unsetCamera();
this.teleportPos = this.entity.getPos(); this.teleportPos = this.entity.getPos();
this.removeCamera();
x = ExtMath.clampd(x, -World.MAX_SIZE + 1, World.MAX_SIZE - 1); x = ExtMath.clampd(x, -World.MAX_SIZE + 1, World.MAX_SIZE - 1);
z = ExtMath.clampd(z, -World.MAX_SIZE + 1, World.MAX_SIZE - 1); z = ExtMath.clampd(z, -World.MAX_SIZE + 1, World.MAX_SIZE - 1);
// this.setLastTeleport(this.getLocation()); // this.setLastTeleport(this.getLocation());
@ -2036,8 +2068,14 @@ public class Player extends User implements Executor, IPlayer
if(this.camera != null) { if(this.camera != null) {
this.camera.setPositionClamped(packetIn.getPositionX(), packetIn.getPositionY(), packetIn.getPositionZ()); this.camera.setPositionClamped(packetIn.getPositionX(), packetIn.getPositionY(), packetIn.getPositionZ());
this.camera.setRotationClamped(packetIn.getYaw(), packetIn.getPitch()); this.camera.setRotationClamped(packetIn.getYaw(), packetIn.getPitch());
if(!this.camera.fixed && packetIn.isOnGround()) if(!this.camera.fixed && packetIn.isOnGround()) {
this.removeCamera(); this.unsetCamera();
}
else {
this.setPlayerLocation(this.camera.posX, this.camera.posY, this.camera.posZ, this.camera.rotYaw, this.camera.rotPitch);
this.entity.setRotationYawHead(this.camera.rotYaw);
this.getEntityWorld().updateMountedMovingPlayer(this.entity);
}
} }
return; return;
} }
@ -2274,7 +2312,7 @@ public class Player extends User implements Executor, IPlayer
public void processBreak(CPacketBreak packetIn) public void processBreak(CPacketBreak packetIn)
{ {
NetHandler.checkThread(packetIn, this, this.server); NetHandler.checkThread(packetIn, this, this.server);
if(this.charEditor) if(this.charEditor || this.entity instanceof EntityCameraHolder)
return; return;
WorldServer worldserver = this.getEntityWorld(); // this.serverController.getWorld(this.playerEntity.dimension); WorldServer worldserver = this.getEntityWorld(); // this.serverController.getWorld(this.playerEntity.dimension);
BlockPos blockpos = packetIn.getPosition(); BlockPos blockpos = packetIn.getPosition();
@ -2360,7 +2398,7 @@ public class Player extends User implements Executor, IPlayer
public void processPlace(CPacketPlace packetIn) public void processPlace(CPacketPlace packetIn)
{ {
NetHandler.checkThread(packetIn, this, this.server); NetHandler.checkThread(packetIn, this, this.server);
if(this.charEditor) if(this.charEditor || this.entity instanceof EntityCameraHolder)
return; return;
WorldServer worldserver = this.getEntityWorld(); // this.serverController.getWorld(this.playerEntity.dimension); WorldServer worldserver = this.getEntityWorld(); // this.serverController.getWorld(this.playerEntity.dimension);
ItemStack itemstack = this.entity.getHeldItem(); ItemStack itemstack = this.entity.getHeldItem();
@ -2466,7 +2504,7 @@ public class Player extends User implements Executor, IPlayer
NetHandler.checkThread(packetIn, this, this.server); NetHandler.checkThread(packetIn, this, this.server);
CPacketAction.Action action = packetIn.getAction(); CPacketAction.Action action = packetIn.getAction();
if(this.charEditor != (action == Action.SET_ALIGN || action == Action.SET_SPECIES || action == Action.SET_CLASS || action == Action.SET_HEIGHT || action == Action.CLOSE_EDITOR || action == Action.CANCEL_EDITOR)) // { if((this.charEditor != (action == Action.SET_ALIGN || action == Action.SET_SPECIES || action == Action.SET_CLASS || action == Action.SET_HEIGHT || action == Action.CLOSE_EDITOR || action == Action.CANCEL_EDITOR)) || (this.entity instanceof EntityCameraHolder && action != Action.WARP_MODE && action != Action.PERF && action != Action.START_PROFILING && action != Action.STOP_PROFILING)) // {
// if(this.local && action == Action.CLOSE_EDITOR) // if(this.local && action == Action.CLOSE_EDITOR)
// this.server.setDone(); // this.server.setDone();
return; return;
@ -2484,7 +2522,6 @@ public class Player extends User implements Executor, IPlayer
int last = this.selected; int last = this.selected;
this.selected = -1; this.selected = -1;
this.teleportPos = this.deathPos = null; this.teleportPos = this.deathPos = null;
this.removeCamera();
this.sendPacket(!this.characters.isEmpty() && last >= 0 ? new SPacketCharacterList(this.selected, last, this.getCharacterInfo(tag)) : new SPacketCharacterList(this.selected)); this.sendPacket(!this.characters.isEmpty() && last >= 0 ? new SPacketCharacterList(this.selected, last, this.getCharacterInfo(tag)) : new SPacketCharacterList(this.selected));
break; break;
} }
@ -2500,7 +2537,6 @@ public class Player extends User implements Executor, IPlayer
Position pos = this.server.getRandomSpawnPosition(origin); Position pos = this.server.getRandomSpawnPosition(origin);
this.entity.teleport(pos); this.entity.teleport(pos);
this.teleportPos = this.deathPos = null; this.teleportPos = this.deathPos = null;
this.removeCamera();
this.sendPacket(new SPacketCharacterList(this.selected, this.selected, new PlayerCharacter(this.entity.getCustomNameTag(), this.entity.getDescription(), this.entity.getAlignment(), this.entity.worldObj.dimension.getDisplay(), this.entity.getPosition(), EntityRegistry.getEntityName(EntityRegistry.getEntityString(this.entity)), this.entity.experienceLevel, world.dimension == Space.INSTANCE ? null : world.dimension.getDisplay()))); this.sendPacket(new SPacketCharacterList(this.selected, this.selected, new PlayerCharacter(this.entity.getCustomNameTag(), this.entity.getDescription(), this.entity.getAlignment(), this.entity.worldObj.dimension.getDisplay(), this.entity.getPosition(), EntityRegistry.getEntityName(EntityRegistry.getEntityString(this.entity)), this.entity.experienceLevel, world.dimension == Space.INSTANCE ? null : world.dimension.getDisplay())));
// if(this.local) // if(this.local)
// this.server.setDone(); // this.server.setDone();
@ -2515,7 +2551,6 @@ public class Player extends User implements Executor, IPlayer
this.server.swapPlayer(this, this.characters.get(index), null); this.server.swapPlayer(this, this.characters.get(index), null);
this.selected = index; this.selected = index;
this.teleportPos = this.deathPos = null; this.teleportPos = this.deathPos = null;
this.removeCamera();
this.sendPacket(new SPacketCharacterList(this.selected)); this.sendPacket(new SPacketCharacterList(this.selected));
break; break;
} }
@ -2530,7 +2565,6 @@ public class Player extends User implements Executor, IPlayer
int last = this.selected; int last = this.selected;
this.selected = index; this.selected = index;
this.teleportPos = this.deathPos = null; this.teleportPos = this.deathPos = null;
this.removeCamera();
this.sendPacket(!this.characters.isEmpty() && last >= 0 ? new SPacketCharacterList(this.selected, last, this.getCharacterInfo(etag)) : new SPacketCharacterList(this.selected)); this.sendPacket(!this.characters.isEmpty() && last >= 0 ? new SPacketCharacterList(this.selected, last, this.getCharacterInfo(etag)) : new SPacketCharacterList(this.selected));
break; break;
} }
@ -2802,7 +2836,7 @@ public class Player extends User implements Executor, IPlayer
case SET_SPECIES: case SET_SPECIES:
Class<? extends Entity> clazz = EntityRegistry.getEntityClass(packetIn.getAuxData()); Class<? extends Entity> clazz = EntityRegistry.getEntityClass(packetIn.getAuxData());
if(EntityNPC.class.isAssignableFrom(clazz)) if(EntityNPC.class.isAssignableFrom(clazz) && clazz != EntityCameraHolder.class)
this.server.swapPlayer(this, null, (Class<? extends EntityNPC>)clazz); this.server.swapPlayer(this, null, (Class<? extends EntityNPC>)clazz);
// Log.CONSOLE.info("" + this.entity.height + "(" + this.entity.getHeight() + ")"); // Log.CONSOLE.info("" + this.entity.height + "(" + this.entity.getHeight() + ")");
break; break;
@ -2867,7 +2901,7 @@ public class Player extends User implements Executor, IPlayer
public void processClick(CPacketClick packetIn) public void processClick(CPacketClick packetIn)
{ {
NetHandler.checkThread(packetIn, this, this.server); NetHandler.checkThread(packetIn, this, this.server);
if(this.charEditor) if(this.charEditor || this.entity instanceof EntityCameraHolder)
return; return;
if (this.entity.openContainer.windowId == packetIn.getWindowId() && this.entity.openContainer.getCanCraft(this.entity)) if (this.entity.openContainer.windowId == packetIn.getWindowId() && this.entity.openContainer.getCanCraft(this.entity))
@ -2916,7 +2950,7 @@ public class Player extends User implements Executor, IPlayer
public void processCheat(CPacketCheat packet) public void processCheat(CPacketCheat packet)
{ {
NetHandler.checkThread(packet, this, this.server); NetHandler.checkThread(packet, this, this.server);
if(this.charEditor || !this.isAdmin()) if(this.charEditor || !this.isAdmin() || this.entity instanceof EntityCameraHolder)
return; return;
Item item = packet.getItem(); Item item = packet.getItem();
if(item == null) if(item == null)
@ -2978,7 +3012,7 @@ public class Player extends User implements Executor, IPlayer
public void processSign(CPacketSign packetIn) public void processSign(CPacketSign packetIn)
{ {
NetHandler.checkThread(packetIn, this, this.server); NetHandler.checkThread(packetIn, this, this.server);
if(this.charEditor) if(this.charEditor || this.entity instanceof EntityCameraHolder)
return; return;
WorldServer worldserver = this.getEntityWorld(); // this.serverController.getWorld(this.playerEntity.dimension); WorldServer worldserver = this.getEntityWorld(); // this.serverController.getWorld(this.playerEntity.dimension);