From 90b48096a6ed690f6e3b7eaade9d411655298ab1 Mon Sep 17 00:00:00 2001 From: NullBite Date: Fri, 25 Mar 2022 02:43:48 -0400 Subject: [PATCH] Add tail armor handling to script --- script.lua | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 121 insertions(+), 7 deletions(-) diff --git a/script.lua b/script.lua index 312a75c..5c9ed38 100644 --- a/script.lua +++ b/script.lua @@ -419,6 +419,13 @@ TAIL_LEGGINGS={ model.Body.MTail1.LeggingsTrim, model.Body.MTail1.MTail2.LeggingsBottom } +TAIL_LEGGINGS_COLOR={ + model.Body.MTail1.Leggings, + model.Body.MTail1.LeggingsTopTrimF, + model.Body.MTail1.LeggingsTopTrimB, + model.Body.MTail1.LeggingsTrim, + model.Body.MTail1.MTail2.LeggingsBottom +} TAIL_BOOTS={ model.Body.MTail1.MTail2.MTail3.Boot, model.Body.MTail1.MTail2.MTail3.LeatherBoot @@ -490,6 +497,10 @@ do --- Armor state local all_armor=reduce(mergeTable, {VANILLA_GROUPS.ARMOR, TAIL_LEGGINGS, TAIL_BOOTS}) PM.addPartGroupFunction(all_armor, function(last) return last and local_state.armor_enabled end) + -- Only show armor if equipped + PM.addPartFunction(model.Body.MTail1.MTail2.MTail3.Boot, function(last) return last and armor_state.boots end) + PM.addPartFunction(model.Body.MTail1.MTail2.MTail3.LeatherBoot, function(last) return last and armor_state.leather_boots end) + PM.addPartGroupFunction(TAIL_LEGGINGS, function(last) return last and armor_state.leggings end) -- Disable when vanilla_enabled @@ -602,11 +613,15 @@ function syncState() ping.syncState(getLocalState()) end +function pmRefresh() + rateLimit(1, PartsManager.refreshAll, "refreshAll") +end + function ping.syncState(tbl) for k, v in pairs(tbl) do local_state[k]=v end - rateLimit(1, PartsManager.refreshAll, "refreshAll") + pmRefresh() end function ping.tPose() @@ -684,24 +699,122 @@ function aquaticTailVisible() function updateTailVisibility() local anim=player.getAnimation() + local water=player.isTouchingWater() tail_cooldown=(tail_cooldown and tail_cooldown > 0) and tail_cooldown-1 or 0 - if aquaticTailVisible() and (anim=="SPIN_ATTACK" or anim=="FALL_FLYING") then + if aquaticTailVisible() and (anim=="SPIN_ATTACK" or anim=="FALL_FLYING" or water) then tail_cooldown=anim=="SPIN_ATTACK" and 60 or (tail_cooldown >= 5 and tail_cooldown or 5) end - if old_state.aquaticTailVisible ~= aquaticTailVisible() then syncState() end + if old_state.aquaticTailVisible ~= aquaticTailVisible() then pmRefresh() end old_state.aquaticTailVisible=aquaticTailVisible() end +armor_color={} +armor_color['leather'] = {131 /255 , 84 /255 , 50 /255} +armor_glint={} +armor_state={} +armor_state['leggings']=false +armor_state['boots']=false +armor_state['leather_boots']=false + +do + local positions={} + positions['leather']={0, 0} + positions['iron']={0, 1} + positions['chainmail']={0, 2} + positions['golden']={0, 3} + positions['diamond']={0, 4} + positions['netherite']={0, 5} + tailuvm=UVManager:new({0, 19}, nil, positions) +end + function armor() -- Get equipped armor, extract name from item ID - local leggingsItem = player.getEquipmentItem(4) - local bootsItem = player.getEquipmentItem(3) - local leggings = string.sub(leggingsItem.getType(), 11, -10) - local boots = string.sub(bootsItem.getType(), 11, -7) + local leggings_item = player.getEquipmentItem(4) + local boots_item = player.getEquipmentItem(3) + local leggings = string.sub(leggings_item.getType(), 11, -10) + local boots = string.sub(boots_item.getType(), 11, -7) + if local_state.armor_enabled then + -- leggings + armor_glint.leggings=leggings_item.hasGlint() + local leggings_color=colorArmor(leggings_item) or armor_color[leggings] + local uv=tailuvm:getUV(leggings) + if uv ~= nil then + armor_state.leggings=true + for k, v in pairs(TAIL_LEGGINGS) do + v.setUV(uv) + end + if leggings=="leather" then + for k, v in pairs(TAIL_LEGGINGS_COLOR) do + v.setColor(leggings_color) + end + else + for k, v in pairs(TAIL_LEGGINGS) do + v.setColor({1, 1, 1}) + end + end + else + armor_state.leggings=false + end + + -- boots + armor_glint.boots=boots_item.hasGlint() + local boots_color=colorArmor(boots_item) or armor_color[boots] + local uv_boots=tailuvm:getUV(boots) + if uv_boots ~= nil then + armor_state.boots=true + for k, v in pairs(TAIL_BOOTS) do + v.setUV(uv_boots) + end + if boots=="leather" then + model.Body.MTail1.MTail2.MTail3.Boot.setColor(boots_color) + armor_state.leather_boots=true + else + model.Body.MTail1.MTail2.MTail3.Boot.setColor({1, 1, 1}) + armor_state.leather_boots=false + end + else + armor_state.boots=false + end + pmRefresh() + else + armor_glint.leggings=false + armor_glint.boots=false + end + + if armor_glint.leggings then + for _, v in pairs(TAIL_LEGGINGS) do + v.setShader("Glint") + end + else + for _, v in pairs(TAIL_LEGGINGS) do + v.setShader("None") + end + end + if armor_glint.boots then + for _, v in pairs(TAIL_BOOTS) do + v.setShader("Glint") + end + else + for _, v in pairs(TAIL_BOOTS) do + v.setShader("None") + end + end + + old_state.boots=boots + old_state.leggings=leggings end +function colorArmor(item) + local tag = item.getTag() + if tag ~= nil and tag.display ~= nil and tag.display.color ~= nil then + return vectors.intToRGB(tag.display.color) + end +end + + + -- }}} -- initialize values -- {{{ @@ -763,6 +876,7 @@ function tick() end + armor() updateTailVisibility() -- End of tick -- old_state.health=player.getHealth()