mirror of
https://github.com/haselkern/Minecraft-ArmorStand.git
synced 2025-05-18 05:55:35 +00:00
320 lines
11 KiB
JavaScript
320 lines
11 KiB
JavaScript
import {generateIntArray, generateUUID, isXYZZero, xyzToTextArray} from "./util.js"
|
|
|
|
// The Armorstand will hold all attributes for an armor stand.
|
|
// TODO Move this to a different file
|
|
export class Armorstand {
|
|
constructor() {
|
|
// Rotation values for the body parts
|
|
this.rotation = 0
|
|
this.head = { x: 0, y: 0, z: 0 }
|
|
this.body = { x: 0, y: 0, z: 0 }
|
|
this.legLeft = { x: 0, y: 0, z: 0 }
|
|
this.legRight = { x: 0, y: 0, z: 0 }
|
|
this.armLeft = { x: 0, y: 0, z: 0 }
|
|
this.armRight = { x: 0, y: 0, z: 0 }
|
|
|
|
// Boolean attributes
|
|
this.invisible = false
|
|
this.invulnerable = false
|
|
this.persistenceRequired = false
|
|
this.noBasePlate = false
|
|
this.noGravity = false
|
|
this.showArms = false
|
|
this.small = false
|
|
this.marker = false
|
|
this.centerCorrected = false
|
|
this.enableEquipment = false
|
|
|
|
// Equipment attributes
|
|
this.equipHandRight = ""
|
|
this.equipHandLeft = ""
|
|
this.equipShoes = ""
|
|
this.equipLeggings = ""
|
|
this.equipChestplate = ""
|
|
this.equipHelmet = ""
|
|
// Valid values for this attribute are "item", "name", "url".
|
|
// TODO More explanation what each value does
|
|
this.helmetMode = "item"
|
|
|
|
// CustomName attributes
|
|
this.customName = ""
|
|
this.showCustomName = false
|
|
this.customNameColor = ""
|
|
this.customNameBold = false
|
|
this.customNameItalic = false
|
|
this.customNameObfuscated = false
|
|
this.customNameStrikethrough = false
|
|
|
|
}
|
|
|
|
getScale() {
|
|
if (this.small) {
|
|
return { x: 0.6, y: 0.6, z: 0.6 }
|
|
} else {
|
|
return { x: 1, y: 1, z: 1 }
|
|
}
|
|
}
|
|
|
|
// Return the code to generate this armorstand
|
|
getCode(mcVersion) {
|
|
//in 1.13, positions are no longer center-corrected. Adding .5 makes it centered. However for players it is already center-corrected
|
|
var code = "/summon armor_stand ~ ~ ~ {"
|
|
|
|
// if (!give) { // TODO
|
|
if (true) {
|
|
// Old entity name
|
|
if (mcVersion == "1.8" || mcVersion == "1.9"){
|
|
code = "/summon ArmorStand ~ ~ ~ {"
|
|
} else if (mcVersion == "1.11") {
|
|
code = "/summon armor_stand ~ ~ ~ {"
|
|
} else {
|
|
if (this.centerCorrected) {
|
|
code = "/summon armor_stand ~ ~-0.5 ~ {"
|
|
} else {
|
|
code = "/summon armor_stand ~ ~ ~ {"
|
|
}
|
|
}
|
|
} else {
|
|
if(mcVersion == "1.8" || mcVersion == "1.9" || mcVersion == "1.11"){
|
|
code = "/give @p minecraft:armor_stand 1 0 {EntityTag:{"
|
|
} else {
|
|
code = "/give @p armor_stand{EntityTag:{"
|
|
}
|
|
}
|
|
|
|
let tags = []
|
|
|
|
//CheckBoxes
|
|
if (this.invisible) {
|
|
tags.push("Invisible:1b")
|
|
}
|
|
if (this.invulnerable) {
|
|
tags.push("Invulnerable:1b")
|
|
}
|
|
if (this.persistenceRequired) {
|
|
tags.push("PersistenceRequired:1b")
|
|
}
|
|
if (this.noBasePlate) {
|
|
tags.push("NoBasePlate:1b")
|
|
}
|
|
if (this.noGravity) {
|
|
tags.push("NoGravity:1b")
|
|
}
|
|
if (this.showArms) {
|
|
tags.push("ShowArms:1b")
|
|
}
|
|
if (this.small) {
|
|
tags.push("Small:1b")
|
|
}
|
|
if (this.marker) {
|
|
tags.push("Marker:1b")
|
|
}
|
|
|
|
// Sliders
|
|
if(this.rotation != 0) {
|
|
tags.push("Rotation:["+this.rotation+"f]")
|
|
}
|
|
|
|
// Equipment
|
|
if (this.enableEquipment) {
|
|
if (mcVersion == "1.8") {
|
|
// Old 1.8 Equipment format
|
|
let armor = []
|
|
|
|
armor.push(this.getHandRightItem())
|
|
armor.push(this.getShoesItem())
|
|
armor.push(this.getLeggingsItem())
|
|
armor.push(this.getChestplateItem())
|
|
armor.push(this.getHeadItem(mcVersion))
|
|
|
|
tags.push("Equipment:["+armor.join(",")+"]")
|
|
} else {
|
|
// New 1.9+ Equipment format
|
|
let armor = []
|
|
|
|
armor.push(this.getShoesItem())
|
|
armor.push(this.getLeggingsItem())
|
|
armor.push(this.getChestplateItem())
|
|
armor.push(this.getHeadItem(mcVersion))
|
|
|
|
tags.push("ArmorItems:["+armor.join(",")+"]")
|
|
|
|
let hands = []
|
|
|
|
hands.push(this.getHandRightItem())
|
|
hands.push(this.getHandLeftItem())
|
|
|
|
tags.push("HandItems:["+hands.join(",")+"]")
|
|
}
|
|
}
|
|
|
|
// Custom name
|
|
if (this.customName) {
|
|
let name = []
|
|
if (mcVersion == "1.8" || mcVersion == "1.9" || mcVersion == "1.11") {
|
|
tags.push(`CustomName:"${this.customName}"`)
|
|
} else if (mcVersion == "1.13") {
|
|
name.push(this.getName())
|
|
name.push(this.getNameColor())
|
|
name.push(this.getNameBold())
|
|
name.push(this.getNameItalic())
|
|
name.push(this.getNameObfuscated())
|
|
name.push(this.getNameStrikethrough())
|
|
|
|
tags.push(`CustomName:"{${name.join("")}}"`)
|
|
} else {
|
|
// CustomNames from 1.14+ can now use single quotes to contain json
|
|
// Replace escaped double quotes with single quotes to make it look pretty
|
|
name.push(this.getName().replaceAll("\\", ""))
|
|
name.push(this.getNameColor().replaceAll("\\", ""))
|
|
name.push(this.getNameBold().replaceAll("\\", ""))
|
|
name.push(this.getNameItalic().replaceAll("\\", ""))
|
|
name.push(this.getNameObfuscated().replaceAll("\\", ""))
|
|
name.push(this.getNameStrikethrough().replaceAll("\\", ""))
|
|
tags.push(`CustomName:'{${name.join("")}}'`)
|
|
}
|
|
}
|
|
|
|
if (this.showCustomName) {
|
|
tags.push("CustomNameVisible:1b")
|
|
}
|
|
|
|
// DisabledSlots // TODO
|
|
// if(useDisabledSlots){
|
|
// tags.push("DisabledSlots:"+calculateDisabledSlotsFlag())
|
|
// }
|
|
|
|
// Now the pose
|
|
let pose = []
|
|
if (!isXYZZero(this.body)) {
|
|
pose.push("Body:"+xyzToTextArray(this.body))
|
|
}
|
|
if (!isXYZZero(this.head)) {
|
|
pose.push("Head:"+xyzToTextArray(this.head))
|
|
}
|
|
if (!isXYZZero(this.legLeft)) {
|
|
pose.push("LeftLeg:"+xyzToTextArray(this.legLeft))
|
|
}
|
|
if (!isXYZZero(this.legRight)) {
|
|
pose.push("RightLeg:"+xyzToTextArray(this.legRight))
|
|
}
|
|
if (this.showArms){
|
|
// Arms will also be added if they are 0, because if we omit them, Minecraft
|
|
// will give the arms a default rotation that does not match our version.
|
|
pose.push("LeftArm:"+xyzToTextArray(this.armLeft))
|
|
pose.push("RightArm:"+xyzToTextArray(this.armRight))
|
|
}
|
|
|
|
|
|
if (pose.length > 0) {
|
|
tags.push("Pose:{"+pose.join(",")+"}")
|
|
}
|
|
|
|
code += tags.join(",")
|
|
code += "}"
|
|
// if (give) { // TODO
|
|
// code += "}"
|
|
// if (mcVersion != "1.8" && mcVersion != "1.9" && mcVersion != "1.11") {
|
|
// code += " 1"
|
|
// }
|
|
// }
|
|
|
|
return code
|
|
}
|
|
|
|
getHandRightItem() {
|
|
if(this.equipHandRight == "") return "{}"
|
|
return "{id:\""+this.equipHandRight+"\",Count:1b}"
|
|
}
|
|
|
|
getHandLeftItem() {
|
|
if(this.equipHandLeft == "") return "{}"
|
|
return "{id:\""+this.equipHandLeft+"\",Count:1b}"
|
|
}
|
|
|
|
getShoesItem() {
|
|
if(this.equipShoes == "") return "{}"
|
|
return "{id:\""+this.equipShoes+"\",Count:1b"
|
|
// +getLeatherColorString($("#shoecolor"), isLeatherArmor(equipShoes)) // TODO Leather armor
|
|
+"}"
|
|
}
|
|
|
|
getLeggingsItem() {
|
|
if(this.equipLeggings == "") return "{}"
|
|
return "{id:\""+this.equipLeggings+"\",Count:1b"
|
|
// +getLeatherColorString($("#leggingscolor"), isLeatherArmor(this.equipLeggings))
|
|
+"}"
|
|
}
|
|
|
|
getChestplateItem() {
|
|
if(this.equipChestplate == "") return "{}"
|
|
return "{id:\""+this.equipChestplate+"\",Count:1b"
|
|
// +getLeatherColorString($("#chestplatecolor"), isLeatherArmor(this.equipChestplate))
|
|
+"}"
|
|
}
|
|
|
|
getHeadItem(mcVersion) {
|
|
if (this.equipHelmet == "") return "{}"
|
|
|
|
// Use input as item
|
|
if (this.helmetMode == "item") {
|
|
return "{id:\""+this.equipHelmet+"\",Count:1b"
|
|
// +getLeatherColorString($("#helmetcolor"), isLeatherArmor(equipHelmet))
|
|
+"}"
|
|
}
|
|
|
|
// Use input as player name
|
|
else if (this.helmetMode == "name") {
|
|
if (mcVersion == "1.8" || mcVersion == "1.10" || mcVersion == "1.11") {
|
|
return "{id:\"skull\",Count:1b,Damage:3b,tag:{SkullOwner:\""+this.equipHelmet+"\"}}"
|
|
} else {
|
|
return "{id:\"player_head\",Count:1b,tag:{SkullOwner:\""+this.equipHelmet+"\"}}"
|
|
}
|
|
}
|
|
|
|
// Use input as url
|
|
// Best reference: http://redd.it/24quwx
|
|
else if (this.helmetMode == "url") {
|
|
let base64Value = btoa('{"textures":{"SKIN":{"url":"'+this.equipHelmet+'"}}}')
|
|
|
|
if (mcVersion == "1.8" || mcVersion == "1.9" || mcVersion == "1.11"){
|
|
return '{id:"skull",Count:1b,Damage:3b,tag:{SkullOwner:{Id:"'+generateUUID()+'",Properties:{textures:[{Value:"'+base64Value+'"}]}}}}'
|
|
} else if (mcVersion == "1.14") {
|
|
return '{id:"minecraft:player_head",Count:1b,tag:{SkullOwner:{Id:"'+generateUUID()+'",Properties:{textures:[{Value:"'+base64Value+'"}]}}}}'
|
|
} else {
|
|
return '{id:"minecraft:player_head",Count:1b,tag:{SkullOwner:{Id:'+generateIntArray()+',Properties:{textures:[{Value:"'+base64Value+'"}]}}}}'
|
|
}
|
|
}
|
|
}
|
|
|
|
getName() {
|
|
if (this.customName == "") return ""
|
|
return `\\"text\\":\\"${this.customName}\\"`
|
|
}
|
|
|
|
getNameColor() {
|
|
if (this.customNameColor == "") return ""
|
|
return `,\\"color\\":\\"${this.customNameColor}\\"`
|
|
}
|
|
|
|
getNameBold() {
|
|
if (!this.customNameBold) return ""
|
|
return `,\\"bold\\":\\"true\\"`
|
|
}
|
|
|
|
getNameItalic() {
|
|
if (!this.customNameItalic) return ""
|
|
return `,\\"italic\\":\\"true\\"`
|
|
}
|
|
|
|
getNameStrikethrough() {
|
|
if (!this.customNameStrikethrough) return ""
|
|
return `,\\"strikethrough\\":\\"true\\"`
|
|
}
|
|
|
|
getNameObfuscated() {
|
|
if (!this.customNameObfuscated) return ""
|
|
return `,\\"obfuscated\\":\\"true\\"`
|
|
}
|
|
|
|
}
|