Even though I know it’s fine I’m never gonna be the same
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 679 B After Width: | Height: | Size: 679 B |
Before Width: | Height: | Size: 639 B After Width: | Height: | Size: 639 B |
Before Width: | Height: | Size: 748 B After Width: | Height: | Size: 748 B |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 519 B After Width: | Height: | Size: 519 B |
Before Width: | Height: | Size: 1.8 MiB After Width: | Height: | Size: 1.8 MiB |
Before Width: | Height: | Size: 308 B After Width: | Height: | Size: 308 B |
700
3d_models/akira/model 4.13/EZAnims.lua
Normal file
|
@ -0,0 +1,700 @@
|
||||||
|
-- V1.14 for 0.1.0 and above
|
||||||
|
-- Made by JimmyHelp
|
||||||
|
-- Contains Manuel's runLater
|
||||||
|
|
||||||
|
local anims = {}
|
||||||
|
|
||||||
|
local controller = {}
|
||||||
|
local controllerMT = {__index = controller}
|
||||||
|
|
||||||
|
local objects = {}
|
||||||
|
|
||||||
|
local exList = {
|
||||||
|
"idling",
|
||||||
|
"walking",
|
||||||
|
"walkingback",
|
||||||
|
"jumpingup",
|
||||||
|
"jumpingdown",
|
||||||
|
"falling",
|
||||||
|
"sprinting",
|
||||||
|
"sprintjumpup",
|
||||||
|
"sprintjumpdown",
|
||||||
|
"crouching",
|
||||||
|
"crouchwalk",
|
||||||
|
"crouchwalkback",
|
||||||
|
"crouchjumpup",
|
||||||
|
"crouchjumpdown",
|
||||||
|
"elytra",
|
||||||
|
"elytradown",
|
||||||
|
"trident",
|
||||||
|
"sleeping",
|
||||||
|
"swimming",
|
||||||
|
"sitting",
|
||||||
|
"sitmove",
|
||||||
|
"sitmoveback",
|
||||||
|
"sitjumpup",
|
||||||
|
"sitjumpdown",
|
||||||
|
"sitpass",
|
||||||
|
"crawling",
|
||||||
|
"crawlstill",
|
||||||
|
"flying",
|
||||||
|
"flywalk",
|
||||||
|
"flywalkback",
|
||||||
|
"flysprint",
|
||||||
|
"flyup",
|
||||||
|
"flydown",
|
||||||
|
"climbing",
|
||||||
|
"climbstill",
|
||||||
|
"climbdown",
|
||||||
|
"climbcrouch",
|
||||||
|
"climbcrouchwalking",
|
||||||
|
"water",
|
||||||
|
"waterwalk",
|
||||||
|
"waterwalkback",
|
||||||
|
"waterup",
|
||||||
|
"waterdown",
|
||||||
|
"watercrouch",
|
||||||
|
"watercrouchwalk",
|
||||||
|
"watercrouchwalkback",
|
||||||
|
"watercrouchup",
|
||||||
|
"watercrouchdown",
|
||||||
|
"hurt",
|
||||||
|
"death"
|
||||||
|
}
|
||||||
|
|
||||||
|
local incList = {
|
||||||
|
"attackR",
|
||||||
|
"attackL",
|
||||||
|
"mineR",
|
||||||
|
"mineL",
|
||||||
|
"holdR",
|
||||||
|
"holdL",
|
||||||
|
"eatR",
|
||||||
|
"eatL",
|
||||||
|
"drinkR",
|
||||||
|
"drinkL",
|
||||||
|
"blockR",
|
||||||
|
"blockL",
|
||||||
|
"bowR",
|
||||||
|
"bowL",
|
||||||
|
"loadR",
|
||||||
|
"loadL",
|
||||||
|
"crossR",
|
||||||
|
"crossL",
|
||||||
|
"spearR",
|
||||||
|
"spearL",
|
||||||
|
"spyglassR",
|
||||||
|
"spyglassL",
|
||||||
|
"hornR",
|
||||||
|
"hornL",
|
||||||
|
"brushR",
|
||||||
|
"brushL",
|
||||||
|
}
|
||||||
|
|
||||||
|
--[[local oldList = {} -- simply make the list again
|
||||||
|
|
||||||
|
for key, _ in pairs(aList) do
|
||||||
|
oldList[key] = {active = false}
|
||||||
|
end]]
|
||||||
|
|
||||||
|
local GSAnimBlend
|
||||||
|
for _, key in ipairs(listFiles(nil,true)) do
|
||||||
|
if key:find("GSAnimBlend$") then
|
||||||
|
GSAnimBlend = require(key)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if GSAnimBlend then GSAnimBlend.safe = false end
|
||||||
|
|
||||||
|
local function setBlendTime(ex,inc,o)
|
||||||
|
for _,list in pairs(o.aList) do
|
||||||
|
for _,value in pairs(list.list) do
|
||||||
|
value:setBlendTime(list.type == "excluAnims" and ex or inc)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param ex? number
|
||||||
|
---@param inc? number
|
||||||
|
function controller:setBlendTimes(ex,inc)
|
||||||
|
if not GSAnimBlend then error("GSAnimBlend was not found in the avatar, and this function is for interacting with GSAnimBlend.",2) end
|
||||||
|
if type(ex) ~= "number" and ex ~= nil then
|
||||||
|
error("The first arg is a non-number value ("..type(ex).."), must be a number or nil.",2)
|
||||||
|
end
|
||||||
|
if type(inc) ~= "number" and inc ~= nil then
|
||||||
|
error("The second arg is a non-number value ("..type(inc).."), must be a number or nil.",2)
|
||||||
|
end
|
||||||
|
if ex == nil then
|
||||||
|
ex = 0
|
||||||
|
end
|
||||||
|
if inc == nil then
|
||||||
|
inc = ex
|
||||||
|
end
|
||||||
|
setBlendTime(ex,inc,self)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
local flyinit
|
||||||
|
local function addAnims(bb,o)
|
||||||
|
local listy = o.aList
|
||||||
|
for _,anim in pairs(bb) do
|
||||||
|
for name,animation in pairs(anim) do
|
||||||
|
if name:find("fly") then flyinit = true end
|
||||||
|
for key, _ in pairs(o.aList) do
|
||||||
|
if name:find(key.."$") then
|
||||||
|
listy[key].list[#listy[key].list+1] = animation
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if GSAnimBlend then setBlendTime(4,4,o) end
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param anim table
|
||||||
|
---@param ifFly? boolean
|
||||||
|
function controller:setAnims(anim,ifFly)
|
||||||
|
flyinit = ifFly
|
||||||
|
for key, value in pairs(anim) do
|
||||||
|
self.aList[key].list = value
|
||||||
|
end
|
||||||
|
if GSAnimBlend then setBlendTime(4,4,self) end
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
---- Run Later by manuel_2867 ----
|
||||||
|
local tmrs={}
|
||||||
|
local t=0
|
||||||
|
---Schedules a function to run after a certain amount of ticks
|
||||||
|
---@param ticks number|function Amount of ticks to wait, or a predicate function to check each tick until it returns true
|
||||||
|
---@param next function Function to run after amount of ticks, or after the predicate function returned true
|
||||||
|
local function wait(ticks,next)
|
||||||
|
local x=type(ticks)=="number"
|
||||||
|
table.insert(tmrs,{t=x and t+ticks,p=x and function()end or ticks,n=next})
|
||||||
|
end
|
||||||
|
function events.TICK()
|
||||||
|
t=t+1
|
||||||
|
for key,timer in pairs(tmrs) do
|
||||||
|
if timer.p()or(timer.t and t >= timer.t)then
|
||||||
|
timer.n()
|
||||||
|
tmrs[key]=nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local fallVel = -0.6
|
||||||
|
---@param vel? number
|
||||||
|
function anims:setFallVel(vel)
|
||||||
|
if type(vel) ~= "number" and vel ~= nil then
|
||||||
|
error("Tried to set the velocity to a non-number value ("..type(vel)..").")
|
||||||
|
end
|
||||||
|
fallVel = vel or -0.6
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
local oneJump = false
|
||||||
|
---@param state? boolean
|
||||||
|
function anims:setOneJump(state)
|
||||||
|
oneJump = state or false
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
local auto = true
|
||||||
|
function anims:disableAutoSearch()
|
||||||
|
auto = false
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
local function getPlay(anim)
|
||||||
|
local exists, hold = pcall(anim.isHolding,anim)
|
||||||
|
return anim:isPlaying() or (exists and hold)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function getOverriders(type,o)
|
||||||
|
return o.overrideStates[type] or o.overrideStates.allAnims
|
||||||
|
end
|
||||||
|
|
||||||
|
local function addOverriders(self,type,...)
|
||||||
|
for _, value in pairs({...}) do
|
||||||
|
if #self.overriders[type] == 64 then
|
||||||
|
error("The max amount of overriding animations for "..type.." (64) was reached. Do not put the code for adding overriding animations in a function, it will infinitely add animations.",3)
|
||||||
|
end
|
||||||
|
self.overriders[type][#self.overriders[type]+1] = value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param state? boolean
|
||||||
|
function controller:setAllOff(state)
|
||||||
|
self.setOverrides.allAnims = state
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param state? boolean
|
||||||
|
function controller:setExcluOff(state)
|
||||||
|
self.setOverrides.excluAnims = state
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param state? boolean
|
||||||
|
function controller:setIncluOff(state)
|
||||||
|
self.setOverrides.incluAnims = state
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param ... Animation
|
||||||
|
function controller:addExcluOverrider(...)
|
||||||
|
addOverriders(self,"excluAnims",...)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param ... Animation
|
||||||
|
function controller:addIncluOverrider(...)
|
||||||
|
addOverriders(self,"incluAnims",...)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param ... Animation
|
||||||
|
function controller:addAllOverrider(...)
|
||||||
|
addOverriders(self,"allAnims",...)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param exState? string
|
||||||
|
---@param inState? string
|
||||||
|
function controller:setState(exState,inState)
|
||||||
|
if type(exState) ~= "string" and exState ~= nil then
|
||||||
|
error("The first arg is a non-string value ("..type(exState).."), must be a string or nil.",2)
|
||||||
|
end
|
||||||
|
if type(inState) ~= "string" and inState ~= nil then
|
||||||
|
error("The second arg is a non-string value ("..type(inState).."), must be a string or nil.",2)
|
||||||
|
end
|
||||||
|
self.toggleState = {excluAnims = exState or "",incluAnims = inState or exState or ""}
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
function controller:getState()
|
||||||
|
return self.toggleState
|
||||||
|
end
|
||||||
|
|
||||||
|
local function getStates(type,o)
|
||||||
|
return o.toggleState[type]
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param spec? string
|
||||||
|
function controller:getAnimationStates(spec)
|
||||||
|
if type(spec) ~= "string" and spec ~= nil then
|
||||||
|
error("The animation state is a non-string value ("..type(spec).."), must be a string or nil.",2)
|
||||||
|
end
|
||||||
|
local states = {}
|
||||||
|
for k,v in pairs(self.aList) do
|
||||||
|
states[k] = v.active
|
||||||
|
end
|
||||||
|
if spec then return self.aList[spec].active else return states end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function setAnimation(anim,override,state,o)
|
||||||
|
local saved = o.aList[anim]
|
||||||
|
local exists = true
|
||||||
|
for _,value in pairs(saved.list) do
|
||||||
|
if value:getName() == state..anim then
|
||||||
|
if not saved.active and saved.stop then break end
|
||||||
|
value:setPlaying(saved.active and not override)
|
||||||
|
if saved.active and saved.stop and not override then
|
||||||
|
value:stop():play()
|
||||||
|
end
|
||||||
|
exists = false
|
||||||
|
else
|
||||||
|
if not saved.active and saved.stop then break end
|
||||||
|
value:stop()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for _,value in pairs(saved.list) do
|
||||||
|
if exists and value:getName() == anim then
|
||||||
|
if not saved.active and saved.stop then break end
|
||||||
|
if saved.active and saved.stop and not override then
|
||||||
|
value:stop():play()
|
||||||
|
break
|
||||||
|
end
|
||||||
|
value:setPlaying(saved.active and not override)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local flying
|
||||||
|
function pings.EZAnims_cFly(x)
|
||||||
|
flying = x
|
||||||
|
end
|
||||||
|
|
||||||
|
local diff = false
|
||||||
|
local rightResult, leftResult, targetEntity, rightMine, leftMine, rightAttack, leftAttack, oldhitBlock, targetBlock, blockSuccess, blockResult, hitBlock
|
||||||
|
local yvel, grounded, oldgrounded, hasJumped, cFlying, oldcFlying
|
||||||
|
local cooldown = false
|
||||||
|
local updateTimer = 0
|
||||||
|
local toggleDiff
|
||||||
|
local function getInfo()
|
||||||
|
if host:isHost() then
|
||||||
|
if flyinit then
|
||||||
|
cFlying = host:isFlying()
|
||||||
|
if cFlying ~= oldcFlying then
|
||||||
|
pings.EZAnims_cFly(cFlying)
|
||||||
|
end
|
||||||
|
oldcFlying = cFlying
|
||||||
|
|
||||||
|
updateTimer = updateTimer + 1
|
||||||
|
if updateTimer % 200 == 0 then
|
||||||
|
pings.EZAnims_cFly(cFlying)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local pose = player:getPose()
|
||||||
|
local velocity = player:getVelocity()
|
||||||
|
local moving = velocity.xz:length() > 0.01
|
||||||
|
local sprinty = player:isSprinting()
|
||||||
|
local vehicle = player:getVehicle()
|
||||||
|
local sitting = vehicle ~= nil or pose == "SITTING" -- if you're reading this code and see this, "SITTING" isn't a vanilla pose, this is for mods
|
||||||
|
local passenger = vehicle and vehicle:getControllingPassenger() ~= player
|
||||||
|
local creativeFlying = (flying or false) and not sitting
|
||||||
|
local standing = pose == "STANDING"
|
||||||
|
local crouching = pose == "CROUCHING" and not creativeFlying
|
||||||
|
local gliding = pose == "FALL_FLYING"
|
||||||
|
local spin = pose == "SPIN_ATTACK"
|
||||||
|
local sleeping = pose == "SLEEPING"
|
||||||
|
local swimming = pose == "SWIMMING"
|
||||||
|
local inWater = player:isUnderwater() and not sitting
|
||||||
|
local inLiquid = player:isInWater() or player:isInLava()
|
||||||
|
local liquidSwim = swimming and inLiquid
|
||||||
|
local crawling = swimming and not inLiquid
|
||||||
|
|
||||||
|
-- hasJumped stuff
|
||||||
|
|
||||||
|
yvel = velocity.y
|
||||||
|
local hover = yvel < .01 and yvel > -.01
|
||||||
|
local goingUp = yvel > .01
|
||||||
|
local goingDown = yvel < -.01
|
||||||
|
local falling = yvel < fallVel
|
||||||
|
local playerGround = world.getBlockState(player:getPos():add(0,-.1,0))
|
||||||
|
local vehicleGround = sitting and world.getBlockState(vehicle:getPos():add(0,-.1,0))
|
||||||
|
oldgrounded = grounded
|
||||||
|
grounded = playerGround:isSolidBlock() or player:isOnGround() or (sitting and vehicleGround:isSolidBlock() or sitting and vehicle:isOnGround())
|
||||||
|
|
||||||
|
local pv = velocity:mul(1, 0, 1):normalize()
|
||||||
|
local pl = models:partToWorldMatrix():applyDir(0,0,-1):mul(1, 0, 1):normalize()
|
||||||
|
local fwd = pv:dot(pl)
|
||||||
|
local backwards = fwd < -.8
|
||||||
|
--local sideways = pv:cross(pl)
|
||||||
|
--local right = sideways.y > .6
|
||||||
|
--local left = sideways.y < -.6
|
||||||
|
|
||||||
|
-- canJump stuff
|
||||||
|
local webbed = world.getBlockState(player:getPos()).id == "minecraft:cobweb"
|
||||||
|
local ladder = player:isClimbing() and not grounded and not flying
|
||||||
|
|
||||||
|
local canJump = not (inLiquid or webbed or grounded)
|
||||||
|
|
||||||
|
local hp = player:getHealth() + player:getAbsorptionAmount()
|
||||||
|
|
||||||
|
if oldgrounded ~= grounded and not grounded and yvel > 0 then
|
||||||
|
cooldown = true
|
||||||
|
wait(10,function() cooldown = false end)
|
||||||
|
end
|
||||||
|
|
||||||
|
if (oldgrounded ~= grounded and not grounded and yvel > 0) and canJump then hasJumped = true end
|
||||||
|
if (grounded and (yvel <= 0 and yvel > -0.1)) or (gliding or inLiquid) then hasJumped = false end
|
||||||
|
|
||||||
|
local neverJump = not (gliding or spin or sleeping or swimming or ladder)
|
||||||
|
local jumpingUp = hasJumped and goingUp and neverJump
|
||||||
|
local jumpingDown = hasJumped and goingDown and not falling and neverJump or (cooldown and not jumpingUp)
|
||||||
|
local isJumping = jumpingUp or jumpingDown or falling
|
||||||
|
local sprinting = sprinty and standing and not inLiquid and not sitting
|
||||||
|
local walking = moving and not sprinting and not isJumping and not sitting
|
||||||
|
local forward = walking and not backwards
|
||||||
|
local backward = walking and backwards
|
||||||
|
|
||||||
|
local handedness = player:isLeftHanded()
|
||||||
|
local rightItem = player:getHeldItem(handedness)
|
||||||
|
local leftItem = player:getHeldItem(not handedness)
|
||||||
|
local rightActive = handedness and "OFF_HAND" or "MAIN_HAND"
|
||||||
|
local leftActive = not handedness and "OFF_HAND" or "MAIN_HAND"
|
||||||
|
local activeness = player:getActiveHand()
|
||||||
|
local using = player:isUsingItem()
|
||||||
|
local rightSuccess = pcall(rightItem.getUseAction,rightItem)
|
||||||
|
if rightSuccess then rightResult = rightItem:getUseAction() else rightResult = "NONE" end
|
||||||
|
local usingR = using and activeness == rightActive and rightResult
|
||||||
|
local leftSuccess = pcall(leftItem.getUseAction,leftItem)
|
||||||
|
if leftSuccess then leftResult = leftItem:getUseAction() else leftResult = "NONE" end
|
||||||
|
local usingL = using and activeness == leftActive and leftResult
|
||||||
|
local swing = player:getSwingTime()
|
||||||
|
local arm = swing == 1 and not sleeping and player:getSwingArm()
|
||||||
|
local rTag= rightItem.tag
|
||||||
|
local lTag = leftItem.tag
|
||||||
|
local crossR = rTag and (rTag["Charged"] == 1 or (rTag["ChargedProjectiles"] and next(rTag["ChargedProjectiles"])~= nil)) or false
|
||||||
|
local crossL = lTag and (lTag["Charged"] == 1 or (lTag["ChargedProjectiles"] and next(lTag["ChargedProjectiles"])~= nil)) or false
|
||||||
|
local exclude = not (crossR or crossL or using)
|
||||||
|
local game = player:getGamemode()
|
||||||
|
local reach = game and 6 or 3
|
||||||
|
|
||||||
|
if swing == 1 then
|
||||||
|
targetEntity = type(player:getTargetedEntity(reach)) == "PlayerAPI" or type(player:getTargetedEntity(reach)) == "LivingEntityAPI"
|
||||||
|
rightMine = oldhitBlock and not targetEntity
|
||||||
|
leftMine = oldhitBlock and not targetEntity
|
||||||
|
rightAttack = (not oldhitBlock or targetEntity)
|
||||||
|
leftAttack = (not oldhitBlock or targetEntity)
|
||||||
|
end
|
||||||
|
|
||||||
|
for _,o in pairs(objects) do
|
||||||
|
|
||||||
|
o.diff = false
|
||||||
|
for types, tabs in pairs(o.overriders) do
|
||||||
|
o.overrideStates[types] = o.setOverrides[types] or false
|
||||||
|
for _, value in pairs(tabs) do
|
||||||
|
if getPlay(value) then
|
||||||
|
o.overrideStates[types] = true
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if o.oldoverStates[types] ~= o.overrideStates[types] then
|
||||||
|
o.diff = true
|
||||||
|
end
|
||||||
|
o.oldoverStates[types] = o.overrideStates[types]
|
||||||
|
end
|
||||||
|
|
||||||
|
local ob = o.aList
|
||||||
|
|
||||||
|
ob.flywalkback.active = creativeFlying and backward and (not (goingDown or goingUp))
|
||||||
|
ob.flysprint.active = creativeFlying and sprinting and not isJumping and (not (goingDown or goingUp))
|
||||||
|
ob.flyup.active = creativeFlying and goingUp
|
||||||
|
ob.flydown.active = creativeFlying and goingDown
|
||||||
|
ob.flywalk.active = creativeFlying and forward and (not (goingDown or goingUp)) and not sleeping or (ob.flysprint.active and next(ob.flysprint.list)==nil) or (ob.flywalkback.active and next(ob.flywalkback.list)==nil)
|
||||||
|
or (ob.flyup.active and next(ob.flyup.list)==nil) or (ob.flydown.active and next(ob.flydown.list)==nil)
|
||||||
|
ob.flying.active = creativeFlying and not sprinting and not moving and standing and not isJumping and (not (goingDown or goingUp)) and not sleeping or (ob.flywalk.active and next(ob.flywalk.list)==nil)
|
||||||
|
|
||||||
|
ob.watercrouchwalkback.active = inWater and crouching and backward and not goingDown
|
||||||
|
ob.watercrouchwalk.active = inWater and crouching and forward and not (goingDown or goingUp) or (ob.watercrouchwalkback.active and next(ob.watercrouchwalkback.list)==nil)
|
||||||
|
ob.watercrouchup.active = inWater and crouching and goingUp
|
||||||
|
ob.watercrouchdown.active = inWater and crouching and goingDown or (ob.watercrouchup.active and next(ob.watercrouchup.list)==nil)
|
||||||
|
ob.watercrouch.active = inWater and crouching and not moving and not (goingDown or goingUp) or (ob.watercrouchdown.active and next(ob.watercrouchdown.list)==nil) or (ob.watercrouchwalk.active and next(ob.watercrouchwalk.list)==nil)
|
||||||
|
|
||||||
|
ob.waterdown.active = inWater and goingDown and not falling and standing and not creativeFlying
|
||||||
|
ob.waterup.active = inWater and goingUp and standing and not creativeFlying
|
||||||
|
ob.waterwalkback.active = inWater and backward and hover and standing and not creativeFlying
|
||||||
|
ob.waterwalk.active = inWater and forward and hover and standing and not creativeFlying or (ob.waterwalkback.active and next(ob.waterwalkback.list)==nil) or (ob.waterdown.active and next(ob.waterdown.list)==nil)
|
||||||
|
or (ob.waterup.active and next(ob.waterup.list)==nil)
|
||||||
|
ob.water.active = inWater and not moving and standing and hover and not creativeFlying or (ob.waterwalk.active and next(ob.waterwalk.list)==nil)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ob.crawlstill.active = crawling and not moving
|
||||||
|
ob.crawling.active = crawling and moving or (ob.crawlstill.active and next(ob.crawlstill.list)==nil)
|
||||||
|
|
||||||
|
ob.swimming.active = liquidSwim or (ob.crawling.active and next(ob.crawling.list)==nil)
|
||||||
|
|
||||||
|
ob.elytradown.active = gliding and goingDown
|
||||||
|
ob.elytra.active = gliding and not goingDown or (ob.elytradown.active and next(ob.elytradown.list)==nil)
|
||||||
|
|
||||||
|
ob.sitpass.active = passenger and standing or false
|
||||||
|
ob.sitjumpdown.active = sitting and not passenger and standing and (jumpingDown or falling)
|
||||||
|
ob.sitjumpup.active = sitting and not passenger and jumpingUp and standing or (ob.sitjumpdown.active and next(ob.sitjumpdown.list)==nil)
|
||||||
|
ob.sitmoveback.active = sitting and not passenger and not isJumping and backwards and standing
|
||||||
|
ob.sitmove.active = velocity:length() > 0 and not passenger and not backwards and standing and sitting and not isJumping or (ob.sitmoveback.active and next(ob.sitmoveback.list)==nil) or (ob.sitjumpup.active and next(ob.sitjumpup.list)==nil)
|
||||||
|
ob.sitting.active = sitting and not passenger and velocity:length() == 0 and not isJumping and standing or (ob.sitmove.active and next(ob.sitmove.list)==nil) or (ob.sitpass.active and next(ob.sitpass.list)==nil) or false
|
||||||
|
|
||||||
|
ob.trident.active = spin
|
||||||
|
ob.sleeping.active = sleeping
|
||||||
|
|
||||||
|
ob.climbcrouchwalking.active = ladder and crouching and not inWater and (moving or yvel ~= 0)
|
||||||
|
ob.climbcrouch.active = ladder and crouching and hover and not moving or (ob.climbcrouchwalking.active and next(ob.climbcrouchwalking.list)==nil)
|
||||||
|
ob.climbdown.active = ladder and goingDown and not crouching
|
||||||
|
ob.climbstill.active = ladder and not crouching and hover
|
||||||
|
ob.climbing.active = ladder and goingUp and not crouching or (ob.climbdown.active and next(ob.climbdown.list)==nil) or (ob.climbstill.active and next(ob.climbstill.list)==nil)
|
||||||
|
|
||||||
|
ob.crouchjumpdown.active = crouching and jumpingDown and not inWater and not ladder
|
||||||
|
ob.crouchjumpup.active = crouching and jumpingUp and not inWater and not ladder or (not oneJump and (ob.crouchjumpdown.active and next(ob.crouchjumpdown.list)==nil))
|
||||||
|
ob.crouchwalkback.active = backward and crouching and not inWater and not ladder or (ob.watercrouchwalkback.active and next(ob.watercrouchwalkback.list)==nil and next(ob.watercrouchwalk.list)==nil and next(ob.watercrouch.list)==nil)
|
||||||
|
ob.crouchwalk.active = forward and crouching and not (jumpingDown or jumpingUp) and not inWater and not ladder or (ob.crouchwalkback.active and next(ob.crouchwalkback.list)==nil) or (not oneJump and (ob.crouchjumpup.active and next(ob.crouchjumpup.list)==nil)) or ((ob.watercrouchwalk.active and not ob.watercrouchwalkback.active) and next(ob.watercrouchwalk.list)==nil and next(ob.watercrouch.list)==nil)
|
||||||
|
ob.crouching.active = crouching and not walking and not inWater and not isJumping and not ladder and not cooldown or (ob.crouchwalk.active and next(ob.crouchwalk.list)==nil) or (ob.climbcrouch.active and next(ob.climbcrouch.list)==nil) or ((ob.watercrouch.active and not ob.watercrouchwalk.active) and next(ob.watercrouch.list)==nil)
|
||||||
|
|
||||||
|
ob.falling.active = falling and not gliding and not creativeFlying and not sitting
|
||||||
|
|
||||||
|
ob.sprintjumpdown.active = jumpingDown and sprinting and not creativeFlying and not ladder or false
|
||||||
|
ob.sprintjumpup.active = jumpingUp and sprinting and not creativeFlying and not ladder or (not oneJump and (ob.sprintjumpdown.active and next(ob.sprintjumpdown.list)==nil)) or false
|
||||||
|
ob.jumpingdown.active = jumpingDown and not ladder and not sprinting and not crouching and not sitting and not sleeping and not gliding and not creativeFlying and not spin and not inWater or (ob.falling.active and next(ob.falling.list)==nil) or (oneJump and (ob.sprintjumpdown.active and next(ob.sprintjumpdown.list)==nil)) or (oneJump and (ob.crouchjumpdown.active and next(ob.crouchjumpdown.list)==nil))
|
||||||
|
ob.jumpingup.active = jumpingUp and not ladder and not sprinting and not crouching and not sitting and not creativeFlying and not inWater or (ob.jumpingdown.active and next(ob.jumpingdown.list)==nil) or (ob.trident.active and next(ob.trident.list)==nil) or (oneJump and (ob.sprintjumpup.active and next(ob.sprintjumpup.list)==nil)) or (oneJump and (ob.crouchjumpup.active and next(ob.crouchjumpup.list)==nil))
|
||||||
|
|
||||||
|
ob.sprinting.active = sprinting and not isJumping and not creativeFlying and not ladder and not cooldown and not inWater or (not oneJump and (ob.sprintjumpup.active and next(ob.sprintjumpup.list)==nil)) or false
|
||||||
|
ob.walkingback.active = backward and standing and not creativeFlying and not ladder and not inWater or (ob.flywalkback.active and next(ob.flywalkback.list)==nil and next(ob.flywalk.list)==nil and next(ob.flying.list)==nil)
|
||||||
|
ob.walking.active = forward and standing and not creativeFlying and not ladder and not cooldown and not inWater or (ob.walkingback.active and next(ob.walkingback.list)==nil) or (ob.sprinting.active and next(ob.sprinting.list)==nil) or (ob.climbing.active and next(ob.climbing.list)==nil)
|
||||||
|
or (ob.swimming.active and next(ob.swimming.list)==nil) or (ob.elytra.active and next(ob.elytra.list)==nil) or (ob.jumpingup.active and next(ob.jumpingup.list)==nil) or (ob.waterwalk.active and (next(ob.waterwalk.list)==nil and next(ob.water.list)==nil)) or ((ob.flywalk.active and not ob.flywalkback.active) and next(ob.flywalk.list)==nil and next(ob.flying.list)==nil)
|
||||||
|
or (ob.crouchwalk.active and (next(ob.crouchwalk)==nil or next(ob.crouching.list)==nil))
|
||||||
|
ob.idling.active = not moving and not sprinting and standing and not isJumping and not sitting and not inWater and not creativeFlying and not ladder or (ob.sleeping.active and next(ob.sleeping.list)==nil) or (ob.sitting.active and next(ob.sitting.list)==nil)
|
||||||
|
or ((ob.water.active and not ob.waterwalk.active) and next(ob.water.list)==nil) or ((ob.flying.active and not ob.flywalk.active) and next(ob.flying.list)==nil) or ((ob.crouching.active and not ob.crouchwalk.active) and next(ob.crouching.list)==nil)
|
||||||
|
|
||||||
|
ob.death.active = hp <= 0
|
||||||
|
ob.hurt.active = player:getNbt().HurtTime > 0 and hp > 0
|
||||||
|
|
||||||
|
ob.attackR.active = arm == rightActive and rightAttack
|
||||||
|
ob.attackL.active = arm == leftActive and leftAttack
|
||||||
|
ob.mineR.active = arm == rightActive and rightMine
|
||||||
|
ob.mineL.active = arm == leftActive and leftMine
|
||||||
|
ob.holdR.active = rightItem.id~="minecraft:air" and exclude
|
||||||
|
ob.holdL.active = leftItem.id~="minecraft:air" and exclude
|
||||||
|
ob.eatR.active = usingR == "EAT"
|
||||||
|
ob.eatL.active = usingL == "EAT"
|
||||||
|
ob.drinkR.active = usingR == "DRINK"
|
||||||
|
ob.drinkL.active = usingL == "DRINK"
|
||||||
|
ob.blockR.active = usingR == "BLOCK"
|
||||||
|
ob.blockL.active = usingL == "BLOCK"
|
||||||
|
ob.bowR.active = usingR == "BOW"
|
||||||
|
ob.bowL.active = usingL == "BOW"
|
||||||
|
ob.loadR.active = usingR == "CROSSBOW"
|
||||||
|
ob.loadL.active = usingL == "CROSSBOW"
|
||||||
|
ob.crossR.active = crossR
|
||||||
|
ob.crossL.active = crossL
|
||||||
|
ob.spearR.active = usingR == "SPEAR"
|
||||||
|
ob.spearL.active = usingL == "SPEAR"
|
||||||
|
ob.spyglassR.active = usingR == "SPYGLASS"
|
||||||
|
ob.spyglassL.active = usingL == "SPYGLASS"
|
||||||
|
ob.hornR.active = usingR == "TOOT_HORN"
|
||||||
|
ob.hornL.active = usingL == "TOOT_HORN"
|
||||||
|
ob.brushR.active = usingR == "BRUSH"
|
||||||
|
ob.brushL.active = usingL == "BRUSH"
|
||||||
|
|
||||||
|
for key,value in pairs(o.aList) do
|
||||||
|
if (value.active ~= o.oldList[key].active) then
|
||||||
|
setAnimation(key,getOverriders(value.type,o),getStates(value.type,o),o)
|
||||||
|
end
|
||||||
|
if (o.toggleDiff or o.diff) and value.active then
|
||||||
|
setAnimation(key,getOverriders(value.type,o),getStates(value.type,o),o)
|
||||||
|
end
|
||||||
|
o.oldList[key].active = value.active
|
||||||
|
end
|
||||||
|
|
||||||
|
o.toggleDiff = false
|
||||||
|
for key,_ in pairs(o.toggleState) do
|
||||||
|
if o.oldToggle[key] ~= o.toggleState[key] then
|
||||||
|
o.toggleDiff = true
|
||||||
|
end
|
||||||
|
o.oldToggle[key] = o.toggleState[key]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
oldhitBlock = hitBlock
|
||||||
|
targetBlock = player:getTargetedBlock(true, game and 5 or 4.5)
|
||||||
|
blockSuccess, blockResult = pcall(targetBlock.getTextures, targetBlock)
|
||||||
|
if blockSuccess then hitBlock = not (next(blockResult) == nil) else hitBlock = true end
|
||||||
|
end
|
||||||
|
|
||||||
|
function events.tick()
|
||||||
|
getInfo()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function getBBModels()
|
||||||
|
local bbmodels = {}
|
||||||
|
for _,layer in pairs(models:getChildren()) do
|
||||||
|
local name = layer:getName()
|
||||||
|
if animations[name] then
|
||||||
|
bbmodels[name] = animations[name]
|
||||||
|
else
|
||||||
|
for _,layer2 in pairs(layer:getChildren()) do
|
||||||
|
local name2 = name.."."..layer2:getName()
|
||||||
|
bbmodels[name2] = animations[name2]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if next(bbmodels) == nil then
|
||||||
|
error("No blockbench models containing animations were found.")
|
||||||
|
end
|
||||||
|
|
||||||
|
local aList = {}
|
||||||
|
local oldList = {}
|
||||||
|
for _, value in pairs(exList) do
|
||||||
|
aList[value] = {active = false,list = {},type = "excluAnims"}
|
||||||
|
oldList[value] = {active = false}
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, value in pairs(incList) do
|
||||||
|
aList[value] = {active = false,list = {},type = "incluAnims"}
|
||||||
|
oldList[value] = {active = false}
|
||||||
|
end
|
||||||
|
|
||||||
|
aList.attackR.stop = true
|
||||||
|
aList.attackL.stop = true
|
||||||
|
aList.mineR.stop = true
|
||||||
|
aList.mineL.stop = true
|
||||||
|
aList.hurt.stop = true
|
||||||
|
|
||||||
|
local o = setmetatable(
|
||||||
|
{
|
||||||
|
bbmodels=bbmodels,
|
||||||
|
aList=aList,
|
||||||
|
oldList=oldList,
|
||||||
|
toggleState = {excluAnims="",incluAnims=""},
|
||||||
|
oldToggle = {excluAnims="",incluAnims=""},
|
||||||
|
toggleDiff = toggleDiff,
|
||||||
|
overriders = {excluAnims = {},incluAnims = {}, allAnims = {}},
|
||||||
|
overrideStates = {excluAnims = false,incluAnims = false, allAnims = false},
|
||||||
|
oldoverStates = {excluAnims = false,incluAnims = false, allAnims = false},
|
||||||
|
setOverrides = {excluAnims = false,incluAnims = false, allAnims = false},
|
||||||
|
diff = diff
|
||||||
|
},
|
||||||
|
controllerMT)
|
||||||
|
objects[1] = o
|
||||||
|
addAnims(bbmodels,o)
|
||||||
|
end
|
||||||
|
|
||||||
|
function events.entity_init()
|
||||||
|
if #objects == 0 then getBBModels() end
|
||||||
|
end
|
||||||
|
|
||||||
|
local firstRun = true
|
||||||
|
---@param ... table
|
||||||
|
function anims:addBBModel(...)
|
||||||
|
local bbmodels = {...}
|
||||||
|
if next(bbmodels) == nil then
|
||||||
|
error("The blockbench model provided couldn't be found because it has no animations, or because of a typo or some other mistake.",2)
|
||||||
|
end
|
||||||
|
|
||||||
|
local aList = {}
|
||||||
|
local oldList = {}
|
||||||
|
for _, value in pairs(exList) do
|
||||||
|
aList[value] = {active = false,list = {},type = "excluAnims"}
|
||||||
|
oldList[value] = {active = false}
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, value in pairs(incList) do
|
||||||
|
aList[value] = {active = false,list = {},type = "incluAnims"}
|
||||||
|
oldList[value] = {active = false}
|
||||||
|
end
|
||||||
|
|
||||||
|
aList.attackR.stop = true
|
||||||
|
aList.attackL.stop = true
|
||||||
|
aList.mineR.stop = true
|
||||||
|
aList.mineL.stop = true
|
||||||
|
aList.hurt.stop = true
|
||||||
|
|
||||||
|
local o = setmetatable(
|
||||||
|
{
|
||||||
|
bbmodels=bbmodels,
|
||||||
|
aList=aList,
|
||||||
|
oldList=oldList,
|
||||||
|
toggleState = {excluAnims="",incluAnims=""},
|
||||||
|
oldToggle = {excluAnims="",incluAnims=""},
|
||||||
|
toggleDiff = toggleDiff,
|
||||||
|
overriders = {excluAnims = {},incluAnims = {}, allAnims = {}},
|
||||||
|
overrideStates = {excluAnims = false,incluAnims = false, allAnims = false},
|
||||||
|
oldoverStates = {excluAnims = false,incluAnims = false, allAnims = false},
|
||||||
|
setOverrides = {excluAnims = false,incluAnims = false, allAnims = false},
|
||||||
|
diff = diff
|
||||||
|
},
|
||||||
|
controllerMT)
|
||||||
|
objects[#objects+1] = o
|
||||||
|
if #objects == 16 then
|
||||||
|
error("The max amount of blockbench models (16) was reached. Do not put the code for adding blockbench models in a function, it will infinitely add blockbench models.",3)
|
||||||
|
end
|
||||||
|
if auto then addAnims(bbmodels,o) end
|
||||||
|
return o
|
||||||
|
end
|
||||||
|
|
||||||
|
anims.controller = controller
|
||||||
|
return anims
|
2041
3d_models/akira/model 4.13/GSAnimBlend.lua
Normal file
58
3d_models/akira/model 4.13/actionwheel.lua
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
--EMOTES--
|
||||||
|
|
||||||
|
local mainPage = action_wheel:newPage()
|
||||||
|
action_wheel:setPage(mainPage)
|
||||||
|
|
||||||
|
function pings.Follow()
|
||||||
|
animations.akira_olivia_pink.followMe:play()
|
||||||
|
end
|
||||||
|
---
|
||||||
|
function pings.Wave()
|
||||||
|
animations.akira_olivia_pink.wave:play()
|
||||||
|
end
|
||||||
|
---
|
||||||
|
function pings.Clap()
|
||||||
|
animations.akira_olivia_pink.clap:play()
|
||||||
|
end
|
||||||
|
---
|
||||||
|
-- function pings.Gun(state)
|
||||||
|
-- animations.akira_olivia_pink.ready_gun:setPlaying(state)
|
||||||
|
-- end
|
||||||
|
---
|
||||||
|
function pings.Sitting(state)
|
||||||
|
animations.akira_olivia_pink.sit_emote:setPlaying(state)
|
||||||
|
end
|
||||||
|
---
|
||||||
|
--------------------------------------------------------------------
|
||||||
|
|
||||||
|
mainPage:newAction()
|
||||||
|
:title("Wave")
|
||||||
|
:item("minecraft:lantern")
|
||||||
|
:hoverColor(1,1,0)
|
||||||
|
:onLeftClick(pings.Wave)
|
||||||
|
|
||||||
|
|
||||||
|
mainPage:newAction()
|
||||||
|
:title("Follow Me")
|
||||||
|
:item("minecraft:compass")
|
||||||
|
:hoverColor(1,1,0)
|
||||||
|
:onLeftClick(pings.Follow)
|
||||||
|
|
||||||
|
mainPage:newAction()
|
||||||
|
:title("Clap")
|
||||||
|
:item("minecraft:rabbit_foot")
|
||||||
|
:hoverColor(1,1,0)
|
||||||
|
:onLeftClick(pings.Clap)
|
||||||
|
|
||||||
|
mainPage:newAction()
|
||||||
|
:title("Sit")
|
||||||
|
:item("minecraft:purpur_stairs")
|
||||||
|
:hoverColor(1,1,0)
|
||||||
|
:onToggle(pings.Sitting)
|
||||||
|
|
||||||
|
-- mainPage:newAction()
|
||||||
|
-- :title("Gun")
|
||||||
|
-- :item("minecraft:crossbow")
|
||||||
|
-- :hoverColor(1,1,0)
|
||||||
|
-- :onToggle(pings.Gun)
|
||||||
|
|
19824
3d_models/akira/model 4.13/akira_eiko_olivia_pink.bbmodel
Normal file
BIN
3d_models/akira/model 4.13/akira_eiko_olivia_pink.gif
Normal file
After Width: | Height: | Size: 1.4 MiB |
19344
3d_models/akira/model 4.13/akira_olivia_pink.bbmodel
Normal file
BIN
3d_models/akira/model 4.13/akiracombined_v4.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
9
3d_models/akira/model 4.13/avatar.json
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"authors": [
|
||||||
|
"oatmealine",
|
||||||
|
"akirapink"
|
||||||
|
],
|
||||||
|
"name": "Akira Eiko Olivia Pink (v4)",
|
||||||
|
"description":"The Last Human on the Internet",
|
||||||
|
"color": "#ff73d3"
|
||||||
|
}
|
BIN
3d_models/akira/model 4.13/elytra.png
Normal file
After Width: | Height: | Size: 519 B |
29
3d_models/akira/model 4.13/script.lua
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
require("GSAnimBlend")
|
||||||
|
local anims = require("EZAnims")
|
||||||
|
local example = anims:addBBModel(animations.akira_olivia_pink)
|
||||||
|
vanilla_model.PLAYER:setVisible(false)
|
||||||
|
vanilla_model.ARMOR:setVisible(false)
|
||||||
|
vanilla_model.HELD_ITEMS:setVisible(true)
|
||||||
|
vanilla_model.ELYTRA:setVisible(true)
|
||||||
|
vanilla_model.CAPE:setVisible(false)
|
||||||
|
BlendTime = 2
|
||||||
|
animations.akira_olivia_pink.sit_emote:setBlendTime(2)
|
||||||
|
-- nameplate.All:setText('[{"text":"akirapink","color":"#ff73d3"}]')
|
||||||
|
|
||||||
|
|
||||||
|
-- models.akira_olivia_pink.root.RightArm
|
||||||
|
-- :copy("RightArmCopy") -- Create a copy of the arm
|
||||||
|
-- :setParentType("models.akira_olivia_pink.root.Torso.RightArm") -- Set the parent type of the copy
|
||||||
|
-- :moveTo(models.akira_olivia_pink.root.Torso) -- Move it to some location in the model
|
||||||
|
--
|
||||||
|
--function events.RENDER(_, context)
|
||||||
|
-- local is_firstperson = context == "FIRST_PERSON"f
|
||||||
|
-- models.akira_olivia_pink.root.Torso.RightArm:setVisible(not is_firstperson)
|
||||||
|
-- models.akira_olivia_pink.root.Torso:setVisible(not is_firstperson)
|
||||||
|
-- models.akira_olivia_pink.root.Torso.backpack:setVisible(not is_firstperson)
|
||||||
|
-- models.akira_olivia_pink.root.Torso.RightArmCopy:setVisible(is_firstperson)
|
||||||
|
--end
|
||||||
|
|
||||||
|
|
||||||
|
--hide vanilla elytra model
|
||||||
|
vanilla_model.ELYTRA:setVisible(false)
|
Before Width: | Height: | Size: 953 KiB After Width: | Height: | Size: 953 KiB |
Before Width: | Height: | Size: 750 KiB After Width: | Height: | Size: 750 KiB |
Before Width: | Height: | Size: 427 KiB After Width: | Height: | Size: 427 KiB |
Before Width: | Height: | Size: 552 KiB After Width: | Height: | Size: 552 KiB |
Before Width: | Height: | Size: 1 MiB After Width: | Height: | Size: 1 MiB |
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
After Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 3.9 KiB |
After Width: | Height: | Size: 75 KiB |
After Width: | Height: | Size: 9.9 KiB |
BIN
pixel_art/undertale-deltarune/better_goner_maker.aseprite
Normal file
Before Width: | Height: | Size: 6 MiB After Width: | Height: | Size: 403 KiB |
BIN
webdev/website_16/bgpaper.png
Normal file
After Width: | Height: | Size: 809 KiB |
|
@ -237,7 +237,7 @@ sub{
|
||||||
<!-- It's worth it, I think : ) -->
|
<!-- It's worth it, I think : ) -->
|
||||||
<!-- what else must be done? -->
|
<!-- what else must be done? -->
|
||||||
<!-- do you want the styling to be moved away from here the "deviating" id is for nothing atm-->
|
<!-- do you want the styling to be moved away from here the "deviating" id is for nothing atm-->
|
||||||
<!-- I don't know, I'm not sure. I was about to ask to- nevermind I changed my mind about the other thing. But yeah IDK if I-Oh...hmm.. -->
|
<!-- I don't know, I'm not sure. I was about to ask to- nevermind I changed my mind about the other thing. But yeah IDK if I-Oh...hmm.. meow -->
|
||||||
<p style="
|
<p style="
|
||||||
/*this element ignores grid positioning, and shoves itself above the margin out of border-box bounds (to clarify what is going on here)*/
|
/*this element ignores grid positioning, and shoves itself above the margin out of border-box bounds (to clarify what is going on here)*/
|
||||||
position:absolute;
|
position:absolute;
|
||||||
|
|
Before Width: | Height: | Size: 3.6 MiB After Width: | Height: | Size: 286 KiB |