diff --git a/src/main/java/noppes/npcs/DataAdvanced.java b/src/main/java/noppes/npcs/DataAdvanced.java index cc9e08614..45ecfe4a8 100644 --- a/src/main/java/noppes/npcs/DataAdvanced.java +++ b/src/main/java/noppes/npcs/DataAdvanced.java @@ -21,6 +21,7 @@ import noppes.npcs.roles.JobSpawner; import noppes.npcs.roles.RoleBank; import noppes.npcs.roles.RoleCompanion; import noppes.npcs.roles.RoleFollower; +import noppes.npcs.roles.RoleMount; import noppes.npcs.roles.RolePostman; import noppes.npcs.roles.RoleTrader; import noppes.npcs.roles.RoleTransporter; @@ -196,7 +197,11 @@ public class DataAdvanced { if (EnumRoleType.values().length <= i) { i -= 2; } - role = EnumRoleType.values()[i]; + EnumRoleType newRole = EnumRoleType.values()[i]; + if (npc.roleInterface instanceof RoleMount && newRole != EnumRoleType.Mount) { + ((RoleMount) npc.roleInterface).onDisable(); + } + role = newRole; if (role == EnumRoleType.None) npc.roleInterface = null; else if (role == EnumRoleType.Bank && !(npc.roleInterface instanceof RoleBank)) @@ -211,6 +216,8 @@ public class DataAdvanced { npc.roleInterface = new RoleTransporter(npc); else if (role == EnumRoleType.Companion && !(npc.roleInterface instanceof RoleCompanion)) npc.roleInterface = new RoleCompanion(npc); + else if (role == EnumRoleType.Mount && !(npc.roleInterface instanceof RoleMount)) + npc.roleInterface = new RoleMount(npc); } public void setJob(int i) { diff --git a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcAdvanced.java b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcAdvanced.java index d7b5ac919..6452145a6 100644 --- a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcAdvanced.java +++ b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcAdvanced.java @@ -25,6 +25,7 @@ import noppes.npcs.client.gui.roles.GuiNpcFollowerJob; import noppes.npcs.client.gui.roles.GuiNpcGuard; import noppes.npcs.client.gui.roles.GuiNpcHealer; import noppes.npcs.client.gui.roles.GuiNpcSpawner; +import noppes.npcs.client.gui.roles.GuiNpcMount; import noppes.npcs.client.gui.roles.GuiNpcTransporter; import noppes.npcs.client.gui.util.GuiNPCInterface2; import noppes.npcs.client.gui.util.GuiNpcButton; @@ -47,7 +48,7 @@ public class GuiNpcAdvanced extends GuiNPCInterface2 implements IGuiData { super.initGui(); int y = guiTop + 10; this.addButton(new GuiNpcButton(3, guiLeft + 85 + 160, y, 52, 20, "selectServer.edit")); - this.addButton(new GuiNpcButton(8, guiLeft + 85, y, 155, 20, new String[]{"role.none", "role.trader", "role.follower", "role.bank", "role.transporter", "role.mailman", NoppesStringUtils.translate("role.companion", "(WIP)")}, npc.advanced.role.ordinal())); + this.addButton(new GuiNpcButton(8, guiLeft + 85, y, 155, 20, new String[]{"role.none", "role.trader", "role.follower", "role.bank", "role.transporter", "role.mailman", NoppesStringUtils.translate("role.companion", "(WIP)"), "role.mount"}, npc.advanced.role.ordinal())); getButton(3).setEnabled(npc.advanced.role != EnumRoleType.None && npc.advanced.role != EnumRoleType.Postman); this.addButton(new GuiNpcButton(4, guiLeft + 85 + 160, y += 22, 52, 20, "selectServer.edit")); @@ -148,6 +149,8 @@ public class GuiNpcAdvanced extends GuiNPCInterface2 implements IGuiData { displayGuiScreen(new GuiNpcTransporter(npc)); else if (npc.advanced.role == EnumRoleType.Companion) displayGuiScreen(new GuiNpcCompanion(npc)); + else if (npc.advanced.role == EnumRoleType.Mount) + displayGuiScreen(new GuiNpcMount(npc)); } else if (compound.hasKey("JobData")) { if (npc.jobInterface != null) npc.jobInterface.readFromNBT(compound); diff --git a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcMount.java b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcMount.java new file mode 100644 index 000000000..57f39a6d8 --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcMount.java @@ -0,0 +1,109 @@ +package noppes.npcs.client.gui.roles; + +import kamkeel.npcs.network.PacketClient; +import kamkeel.npcs.network.packets.request.role.RoleSavePacket; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.StatCollector; +import noppes.npcs.client.gui.util.GuiNPCInterface2; +import noppes.npcs.client.gui.util.GuiNpcButton; +import noppes.npcs.client.gui.util.GuiNpcLabel; +import noppes.npcs.client.gui.util.GuiNpcTextField; +import noppes.npcs.client.gui.util.ITextfieldListener; +import noppes.npcs.entity.EntityNPCInterface; +import noppes.npcs.roles.RoleMount; + +import java.util.Locale; + +public class GuiNpcMount extends GuiNPCInterface2 implements ITextfieldListener { + + private final RoleMount role; + + public GuiNpcMount(EntityNPCInterface npc) { + super(npc); + this.role = npc.roleInterface instanceof RoleMount ? (RoleMount) npc.roleInterface : null; + } + + @Override + public void initGui() { + super.initGui(); + if (role == null) { + close(); + return; + } + + int y = guiTop + 6; + addOffsetRow(0, "role.mount.offsetx", role.getOffsetX(), y); + y += 24; + addOffsetRow(1, "role.mount.offsety", role.getOffsetY(), y); + y += 24; + addOffsetRow(2, "role.mount.offsetz", role.getOffsetZ(), y); + + addButton(new GuiNpcButton(3, guiLeft + 4, y + 26, 80, 20, "role.mount.reset")); + + GuiNpcLabel speedLabel = new GuiNpcLabel(4, "", guiLeft + 4, y + 6); + speedLabel.label = StatCollector.translateToLocalFormatted("role.mount.walkspeed", npc.ais.getWalkingSpeed()); + addLabel(speedLabel); + } + + private void addOffsetRow(int id, String translationKey, float value, int y) { + addLabel(new GuiNpcLabel(id, translationKey, guiLeft + 4, y + 5)); + GuiNpcTextField field = new GuiNpcTextField(id, this, guiLeft + 140, y, 80, 20, format(value)); + field.floatsOnly = true; + field.setMinMaxDefaultFloat(-5.0F, 5.0F, 0.0F); + addTextField(field); + } + + private String format(float value) { + return String.format(Locale.ROOT, "%.2f", value); + } + + @Override + public void buttonEvent(GuiButton guibutton) { + if (role == null) + return; + if (guibutton.id == 3) { + role.resetOffsets(); + initGui(); + } + } + + @Override + public void unFocused(GuiNpcTextField textfield) { + if (role == null) + return; + float value = textfield.isFloat() ? textfield.getFloat() : 0.0F; + switch (textfield.id) { + case 0: + role.setOffsetX(value); + break; + case 1: + role.setOffsetY(value); + break; + case 2: + role.setOffsetZ(value); + break; + } + textfield.setText(format(valueForField(textfield.id))); + } + + private float valueForField(int id) { + switch (id) { + case 0: + return role.getOffsetX(); + case 1: + return role.getOffsetY(); + case 2: + return role.getOffsetZ(); + default: + return 0.0F; + } + } + + @Override + public void save() { + if (role != null) { + PacketClient.sendClient(new RoleSavePacket(role.writeToNBT(new NBTTagCompound()))); + } + } +} diff --git a/src/main/java/noppes/npcs/constants/EnumRoleType.java b/src/main/java/noppes/npcs/constants/EnumRoleType.java index a82f4b607..624658fb3 100644 --- a/src/main/java/noppes/npcs/constants/EnumRoleType.java +++ b/src/main/java/noppes/npcs/constants/EnumRoleType.java @@ -2,5 +2,5 @@ package noppes.npcs.constants; public enum EnumRoleType { - None, Trader, Follower, Bank, Transporter, Postman, Companion + None, Trader, Follower, Bank, Transporter, Postman, Companion, Mount } diff --git a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java index 92ad030c5..bba547c61 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java @@ -40,7 +40,10 @@ public abstract class EntityNPCFlying extends EntityNPCInterface { super.onLivingUpdate(); } + @Override public void moveEntityWithHeading(float p_70612_1_, float p_70612_2_) { + if (handleMountedMovement(p_70612_1_, p_70612_2_)) + return; if (!this.canFly() || this.hurtTime != 0 || !this.canBreathe()) { super.moveEntityWithHeading(p_70612_1_, p_70612_2_); return; @@ -92,4 +95,46 @@ public abstract class EntityNPCFlying extends EntityNPCInterface { this.limbSwingAmount += (distance - this.limbSwingAmount) * 0.4F; this.limbSwing += this.limbSwingAmount; } + + @Override + protected void doMountedMovement(float strafe, float forward) { + if (!this.canFly() || this.hurtTime != 0 || !this.canBreathe()) { + super.doMountedMovement(strafe, forward); + return; + } + + boolean aboveLimit = false; + double heightOffGround = this.posY - this.worldObj.getTopSolidOrLiquidBlock((int) this.posX, (int) this.posZ); + if (heightOffGround < 0) { + Vec3 pos = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + Vec3 posLimit = Vec3.createVectorHelper(this.posX, this.posY - this.ais.flyHeightLimit, this.posZ); + MovingObjectPosition mob = this.worldObj.rayTraceBlocks(pos, posLimit, true); + if (mob == null || mob.typeOfHit == MovingObjectPosition.MovingObjectType.MISS) { + aboveLimit = true; + } + } else if (heightOffGround > this.ais.flyHeightLimit) { + aboveLimit = true; + } + if (aboveLimit && this.ais.hasFlyLimit || (heightOffGround < Math.ceil(this.height) && this.motionY == 0)) { + this.flyLimitAllow = false; + if (!this.getNavigator().noPath() && this.motionY > 0) { + this.motionY = 0; + } else { + super.doMountedMovement(strafe, forward); + return; + } + } + this.flyLimitAllow = true; + + double d3 = this.motionY; + super.doMountedMovement(strafe, forward); + this.motionY = d3; + + if (this.getNavigator().noPath()) { + this.motionY = -Math.abs(this.ais.flyGravity); + } + + this.updateLimbSwing(); + this.velocityChanged = true; + } } diff --git a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java index c72aa7117..fb125982e 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java @@ -152,6 +152,7 @@ import noppes.npcs.roles.JobFollower; import noppes.npcs.roles.JobInterface; import noppes.npcs.roles.RoleCompanion; import noppes.npcs.roles.RoleFollower; +import noppes.npcs.roles.RoleMount; import noppes.npcs.roles.RoleInterface; import noppes.npcs.scripted.NpcAPI; import noppes.npcs.scripted.entity.ScriptNpc; @@ -1753,6 +1754,11 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti roleInterface.writeToNBT(bard); compound.setTag("Companion", bard); } + if (advanced.role == EnumRoleType.Mount) { + NBTTagCompound mount = new NBTTagCompound(); + roleInterface.writeToNBT(mount); + compound.setTag("Mount", mount); + } if (this instanceof EntityCustomNpc) { compound.setTag("ModelData", ((EntityCustomNpc) this).modelData.writeToNBT()); @@ -1790,6 +1796,10 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti NBTTagCompound companion = compound.getCompoundTag("Companion"); roleInterface.readFromNBT(companion); } + if (advanced.role == EnumRoleType.Mount) { + NBTTagCompound mount = compound.getCompoundTag("Mount"); + roleInterface.readFromNBT(mount); + } if (this instanceof EntityCustomNpc) { ((EntityCustomNpc) this).modelData.readFromNBT(compound.getCompoundTag("ModelData")); } @@ -2056,15 +2066,86 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti } @Override - public void moveEntityWithHeading(float p_70612_1_, float p_70612_2_) { + public void moveEntityWithHeading(float strafe, float forward) { + if (handleMountedMovement(strafe, forward)) { + return; + } double d0 = this.posX; double d1 = this.posY; double d2 = this.posZ; - super.moveEntityWithHeading(p_70612_1_, p_70612_2_); + super.moveEntityWithHeading(strafe, forward); if (advanced.role == EnumRoleType.Companion && !isRemote()) ((RoleCompanion) roleInterface).addMovementStat(this.posX - d0, this.posY - d1, this.posZ - d2); } + protected boolean handleMountedMovement(float strafe, float forward) { + if (advanced.role != EnumRoleType.Mount || !(roleInterface instanceof RoleMount)) + return false; + if (!(riddenByEntity instanceof EntityLivingBase)) + return false; + + EntityLivingBase rider = (EntityLivingBase) riddenByEntity; + this.prevRotationYaw = this.rotationYaw = rider.rotationYaw; + this.rotationPitch = rider.rotationPitch * 0.5F; + this.setRotation(this.rotationYaw, this.rotationPitch); + this.renderYawOffset = this.rotationYaw; + this.rotationYawHead = this.rotationYaw; + + float controlledStrafe = rider.moveStrafing * 0.5F; + float controlledForward = rider.moveForward; + if (controlledForward <= 0.0F) { + controlledForward *= 0.25F; + } + + float moveSpeed = getSpeed(); + if (rider.isSprinting()) { + moveSpeed *= 1.2F; + } + + this.setSprinting(rider.isSprinting()); + this.setAIMoveSpeed(moveSpeed); + this.stepHeight = 1.0F; + this.jumpMovementFactor = this.getAIMoveSpeed() * 0.1F; + + this.getNavigator().clearPathEntity(); + this.setAttackTarget(null); + this.setRevengeTarget(null); + + this.fallDistance = 0.0F; + rider.fallDistance = 0.0F; + + applyMountedVerticalMotion(rider, moveSpeed); + doMountedMovement(controlledStrafe, controlledForward); + + return true; + } + + protected void doMountedMovement(float strafe, float forward) { + super.moveEntityWithHeading(strafe, forward); + } + + protected void applyMountedVerticalMotion(EntityLivingBase rider, float moveSpeed) { + if (canFly()) { + double vertical = Math.max(0.1D, moveSpeed * 0.6D); + if (rider.isJumping()) { + this.motionY = Math.min(this.motionY + vertical, vertical); + this.isAirBorne = true; + } else { + float pitch = rider.rotationPitch; + if (pitch < -10F) { + this.motionY = vertical; + } else if (pitch > 10F) { + this.motionY = -vertical; + } else if (!this.onGround) { + this.motionY *= 0.6D; + } + } + } else if (rider.isJumping() && this.onGround) { + this.motionY = 0.5D; + this.isAirBorne = true; + } + } + @Override public boolean allowLeashing() { return false; @@ -2075,6 +2156,23 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti return false; } + @Override + public void updateRiderPosition() { + super.updateRiderPosition(); + if (advanced.role == EnumRoleType.Mount && roleInterface instanceof RoleMount && riddenByEntity != null) { + RoleMount mount = (RoleMount) roleInterface; + double yaw = Math.toRadians(this.renderYawOffset); + double offsetX = mount.getOffsetX(); + double offsetZ = mount.getOffsetZ(); + double rotatedX = offsetX * Math.cos(yaw) - offsetZ * Math.sin(yaw); + double rotatedZ = offsetX * Math.sin(yaw) + offsetZ * Math.cos(yaw); + double offsetY = mount.getOffsetY(); + riddenByEntity.setPosition(this.posX + rotatedX, + this.posY + this.getMountedYOffset() + riddenByEntity.getYOffset() + offsetY, + this.posZ + rotatedZ); + } + } + // Model Types: 0: Steve 64x32, 1: Steve 64x64, 2: Alex 64x64 public int getModelType() { return this.display.modelType; diff --git a/src/main/java/noppes/npcs/roles/RoleMount.java b/src/main/java/noppes/npcs/roles/RoleMount.java new file mode 100644 index 000000000..455f8f329 --- /dev/null +++ b/src/main/java/noppes/npcs/roles/RoleMount.java @@ -0,0 +1,112 @@ +package noppes.npcs.roles; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import noppes.npcs.entity.EntityNPCInterface; +import noppes.npcs.util.ValueUtil; + +public class RoleMount extends RoleInterface { + + private float offsetX; + private float offsetY; + private float offsetZ; + private boolean storedReturnToStart; + + public RoleMount(EntityNPCInterface npc) { + super(npc); + this.storedReturnToStart = npc.ais.returnToStart; + npc.ais.returnToStart = false; + } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound compound) { + compound.setFloat("MountOffsetX", offsetX); + compound.setFloat("MountOffsetY", offsetY); + compound.setFloat("MountOffsetZ", offsetZ); + compound.setBoolean("MountReturnFlag", storedReturnToStart); + return compound; + } + + @Override + public void readFromNBT(NBTTagCompound compound) { + setOffsetX(compound.getFloat("MountOffsetX")); + setOffsetY(compound.getFloat("MountOffsetY")); + setOffsetZ(compound.getFloat("MountOffsetZ")); + if (compound.hasKey("MountReturnFlag")) { + storedReturnToStart = compound.getBoolean("MountReturnFlag"); + } else { + storedReturnToStart = npc.ais.returnToStart; + } + npc.ais.returnToStart = false; + } + + @Override + public void interact(EntityPlayer player) { + if (player == null || npc.worldObj.isRemote) { + return; + } + if (npc.riddenByEntity != null && npc.riddenByEntity != player) { + return; + } + if (player.ridingEntity != null && player.ridingEntity != npc) { + player.mountEntity(null); + } + player.fallDistance = 0.0F; + npc.fallDistance = 0.0F; + player.mountEntity(npc); + npc.getNavigator().clearPathEntity(); + npc.setAttackTarget(null); + npc.setRevengeTarget(null); + } + + @Override + public boolean aiShouldExecute() { + if (npc.ais.returnToStart) { + npc.ais.returnToStart = false; + } + return false; + } + + public void setOffsetX(float value) { + this.offsetX = clamp(value); + } + + public void setOffsetY(float value) { + this.offsetY = clamp(value); + } + + public void setOffsetZ(float value) { + this.offsetZ = clamp(value); + } + + public float getOffsetX() { + return offsetX; + } + + public float getOffsetY() { + return offsetY; + } + + public float getOffsetZ() { + return offsetZ; + } + + private float clamp(float value) { + return ValueUtil.clamp(value, -5.0F, 5.0F); + } + + public void resetOffsets() { + offsetX = 0.0F; + offsetY = 0.0F; + offsetZ = 0.0F; + } + + public void onDisable() { + npc.ais.returnToStart = storedReturnToStart; + } + + @Override + public void delete() { + onDisable(); + } +} diff --git a/src/main/resources/assets/customnpcs/lang/cs_CZ.lang b/src/main/resources/assets/customnpcs/lang/cs_CZ.lang index f8f092bbf..e9cd29b99 100644 --- a/src/main/resources/assets/customnpcs/lang/cs_CZ.lang +++ b/src/main/resources/assets/customnpcs/lang/cs_CZ.lang @@ -439,3 +439,9 @@ item.npcOfficerHelmet.name=důstojnické brnění item.npcCrown.name=Koruna item.npcCrown2.name=Koruna key.npcInventory=NPC inventář +role.mount=Mount +role.mount.offsetx=Seat Offset X +role.mount.offsety=Seat Offset Y +role.mount.offsetz=Seat Offset Z +role.mount.reset=Reset Position +role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/de_DE.lang b/src/main/resources/assets/customnpcs/lang/de_DE.lang index f88dd2769..38f3d3377 100644 --- a/src/main/resources/assets/customnpcs/lang/de_DE.lang +++ b/src/main/resources/assets/customnpcs/lang/de_DE.lang @@ -871,3 +871,9 @@ companion.stage=Bühne #German by DewTix key.npcInventory=NPC Inventar +role.mount=Mount +role.mount.offsetx=Seat Offset X +role.mount.offsety=Seat Offset Y +role.mount.offsetz=Seat Offset Z +role.mount.reset=Reset Position +role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/en_US.lang b/src/main/resources/assets/customnpcs/lang/en_US.lang index 57dc34cdc..c3edc664e 100644 --- a/src/main/resources/assets/customnpcs/lang/en_US.lang +++ b/src/main/resources/assets/customnpcs/lang/en_US.lang @@ -417,6 +417,12 @@ role.transporter=Transporter role.mailman=Mailman role.marketname=Linked Marketname role.companion=Companion +role.mount=Mount +role.mount.offsetx=Seat Offset X +role.mount.offsety=Seat Offset Y +role.mount.offsetz=Seat Offset Z +role.mount.reset=Reset Position +role.mount.walkspeed=Walking speed: %s trader.insufficient=Insufficient Currency trader.sufficient=Sufficient Currency diff --git a/src/main/resources/assets/customnpcs/lang/es_AR.lang b/src/main/resources/assets/customnpcs/lang/es_AR.lang index 27c79cd78..5ca50fc49 100644 --- a/src/main/resources/assets/customnpcs/lang/es_AR.lang +++ b/src/main/resources/assets/customnpcs/lang/es_AR.lang @@ -499,3 +499,9 @@ item.npcSlingshot.name=Slingshot item.npcMusket.name=Mosquete item.npcExcalibur.name=Excalibur key.npcInventory=Inventario de NPC +role.mount=Mount +role.mount.offsetx=Seat Offset X +role.mount.offsety=Seat Offset Y +role.mount.offsetz=Seat Offset Z +role.mount.reset=Reset Position +role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/es_MX.lang b/src/main/resources/assets/customnpcs/lang/es_MX.lang index 53bca03af..fd58878af 100644 --- a/src/main/resources/assets/customnpcs/lang/es_MX.lang +++ b/src/main/resources/assets/customnpcs/lang/es_MX.lang @@ -499,3 +499,9 @@ item.npcSlingshot.name=Slingshot item.npcMusket.name=Mosquete item.npcExcalibur.name=Excalibur key.npcInventory=Inventario de NPC +role.mount=Mount +role.mount.offsetx=Seat Offset X +role.mount.offsety=Seat Offset Y +role.mount.offsetz=Seat Offset Z +role.mount.reset=Reset Position +role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/fr_FR.lang b/src/main/resources/assets/customnpcs/lang/fr_FR.lang index b22a75ac3..6229aa1b9 100644 --- a/src/main/resources/assets/customnpcs/lang/fr_FR.lang +++ b/src/main/resources/assets/customnpcs/lang/fr_FR.lang @@ -541,3 +541,9 @@ item.npcSlingshot.name=Lance-Pièrre item.npcMusket.name=Mousquet item.npcExcalibur.name=Excalibur key.npcInventory=Inventaire Pnj +role.mount=Mount +role.mount.offsetx=Seat Offset X +role.mount.offsety=Seat Offset Y +role.mount.offsetz=Seat Offset Z +role.mount.reset=Reset Position +role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/hu_HU.lang b/src/main/resources/assets/customnpcs/lang/hu_HU.lang index 1a9fc71f5..e3112252c 100644 --- a/src/main/resources/assets/customnpcs/lang/hu_HU.lang +++ b/src/main/resources/assets/customnpcs/lang/hu_HU.lang @@ -541,3 +541,9 @@ item.npcSlingshot.name=Csúzli item.npcMusket.name=Muskéta item.npcExcalibur.name=Excalibur key.npcInventory=NPC felszerelés +role.mount=Mount +role.mount.offsetx=Seat Offset X +role.mount.offsety=Seat Offset Y +role.mount.offsetz=Seat Offset Z +role.mount.reset=Reset Position +role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/id_ID.lang b/src/main/resources/assets/customnpcs/lang/id_ID.lang index a5952d7ab..a7de30101 100644 --- a/src/main/resources/assets/customnpcs/lang/id_ID.lang +++ b/src/main/resources/assets/customnpcs/lang/id_ID.lang @@ -316,3 +316,9 @@ item.npcAmethyst.name=Permata Amethyst item.npcRuby.name=Permata Rubi +role.mount=Mount +role.mount.offsetx=Seat Offset X +role.mount.offsety=Seat Offset Y +role.mount.offsetz=Seat Offset Z +role.mount.reset=Reset Position +role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/ko_KR.lang b/src/main/resources/assets/customnpcs/lang/ko_KR.lang index 993006c34..64b370445 100644 --- a/src/main/resources/assets/customnpcs/lang/ko_KR.lang +++ b/src/main/resources/assets/customnpcs/lang/ko_KR.lang @@ -796,3 +796,9 @@ enchantment.infinite=무한 enchantment.poison=독 key.npcInventory=NPC 인벤토리 +role.mount=Mount +role.mount.offsetx=Seat Offset X +role.mount.offsety=Seat Offset Y +role.mount.offsetz=Seat Offset Z +role.mount.reset=Reset Position +role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/nl_NL.lang b/src/main/resources/assets/customnpcs/lang/nl_NL.lang index 6756f197f..6998ad909 100644 --- a/src/main/resources/assets/customnpcs/lang/nl_NL.lang +++ b/src/main/resources/assets/customnpcs/lang/nl_NL.lang @@ -230,4 +230,10 @@ item.npcCrown2.name=Kroon item.npcNinjaHead.name=Ninja Helm item.npcNinjaChest.name=Ninja Borst -item.npcNinjaPants.name=Ninja Broek \ No newline at end of file +item.npcNinjaPants.name=Ninja Broek +role.mount=Mount +role.mount.offsetx=Seat Offset X +role.mount.offsety=Seat Offset Y +role.mount.offsetz=Seat Offset Z +role.mount.reset=Reset Position +role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/pl_PL.lang b/src/main/resources/assets/customnpcs/lang/pl_PL.lang index 2f1047663..0526906d6 100644 --- a/src/main/resources/assets/customnpcs/lang/pl_PL.lang +++ b/src/main/resources/assets/customnpcs/lang/pl_PL.lang @@ -497,3 +497,9 @@ item.npcSlingshot.name=Proca item.npcMusket.name=Muszkiet item.npcExcalibur.name=Excalibur key.npcInventory=Inwentarz npc +role.mount=Mount +role.mount.offsetx=Seat Offset X +role.mount.offsety=Seat Offset Y +role.mount.offsetz=Seat Offset Z +role.mount.reset=Reset Position +role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/pt_BR.lang b/src/main/resources/assets/customnpcs/lang/pt_BR.lang index c3bbd3c26..3e5411213 100644 --- a/src/main/resources/assets/customnpcs/lang/pt_BR.lang +++ b/src/main/resources/assets/customnpcs/lang/pt_BR.lang @@ -497,3 +497,9 @@ item.npcSlingshot.name=Estilingue item.npcMusket.name=Mosquete item.npcExcalibur.name=Excalibur key.npcInventory=Inventário NPC +role.mount=Mount +role.mount.offsetx=Seat Offset X +role.mount.offsety=Seat Offset Y +role.mount.offsetz=Seat Offset Z +role.mount.reset=Reset Position +role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/ru_RU.lang b/src/main/resources/assets/customnpcs/lang/ru_RU.lang index 0b286b3ae..f190a84f0 100644 --- a/src/main/resources/assets/customnpcs/lang/ru_RU.lang +++ b/src/main/resources/assets/customnpcs/lang/ru_RU.lang @@ -1020,3 +1020,9 @@ questgui.reject=Отменить questgui.accept=Принять key.npcInventory=Инвентарь NPC +role.mount=Mount +role.mount.offsetx=Seat Offset X +role.mount.offsety=Seat Offset Y +role.mount.offsetz=Seat Offset Z +role.mount.reset=Reset Position +role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/sv_SE.lang b/src/main/resources/assets/customnpcs/lang/sv_SE.lang index 91be6d6bc..adf43d88c 100644 --- a/src/main/resources/assets/customnpcs/lang/sv_SE.lang +++ b/src/main/resources/assets/customnpcs/lang/sv_SE.lang @@ -307,3 +307,9 @@ item.npcKey.name=Key item.npcPendant.name=Pendant item.npcBlueprint.name=Blueprint item.npcRing.name=Ring +role.mount=Mount +role.mount.offsetx=Seat Offset X +role.mount.offsety=Seat Offset Y +role.mount.offsetz=Seat Offset Z +role.mount.reset=Reset Position +role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/zh_CN.lang b/src/main/resources/assets/customnpcs/lang/zh_CN.lang index 7831cf590..41799f778 100644 --- a/src/main/resources/assets/customnpcs/lang/zh_CN.lang +++ b/src/main/resources/assets/customnpcs/lang/zh_CN.lang @@ -1243,3 +1243,9 @@ hitbox.width=宽度比例 hitbox.height=身高比例 key.npcInventory=NPC物品栏 +role.mount=Mount +role.mount.offsetx=Seat Offset X +role.mount.offsety=Seat Offset Y +role.mount.offsetz=Seat Offset Z +role.mount.reset=Reset Position +role.mount.walkspeed=Walking speed: %s diff --git a/src/main/resources/assets/customnpcs/lang/zh_TW.lang b/src/main/resources/assets/customnpcs/lang/zh_TW.lang index 168709725..6b864af53 100644 --- a/src/main/resources/assets/customnpcs/lang/zh_TW.lang +++ b/src/main/resources/assets/customnpcs/lang/zh_TW.lang @@ -313,3 +313,9 @@ item.npcBronzeIngot.name=銅錠 item.npcSaphire.name=藍寶石 item.npcAmethyst.name=紫水晶 item.npcRuby.name=紅寶石 +role.mount=Mount +role.mount.offsetx=Seat Offset X +role.mount.offsety=Seat Offset Y +role.mount.offsetz=Seat Offset Z +role.mount.reset=Reset Position +role.mount.walkspeed=Walking speed: %s