FILES ----- help.config interface\easel\signstoregui.lua items\armors\biome\jungle\headband\mask.png monsters\pets\followstate.lua monsters\pets\groundpet.lua monsters\pets\petcapturepod.lua monsters\pets\cat\catbehavior.lua objects\generic\tvstation\tvstation.object objects\mission\miningverticaldoor\miningverticaldoor.object objects\outpost\customsign\customsign.object objects\outpost\signstore\customeasel-data.lua projectiles\boss\crystalboss\crystalshard1.projectile projectiles\boss\crystalboss\crystalshard2.projectile projectiles\boss\crystalboss\crystalshard3.projectile projectiles\boss\crystalboss\crystalshard4.projectile projectiles\boss\crystalboss\crystalshard5.projectile projectiles\boss\crystalboss\crystalshard6.projectile quests\outpost\phase1optional\floranfan1.questtemplate [NEW] recipes\biomes\tar\tarpitchest.recipe scripts\api\npchooks.lua scripts\api\objecthooks.lua treasure\biome.treasurepools DIFFS ----- help.config 19d18 < "message" : "Usage /message message. Same as sending a message by just pressing enter and typing. Useful for avoiding having your messaged parsed by the command parser.", interface\easel\signstoregui.lua 63c63 < ["frameRight"] = {"main", 172, 3, 170+11, 3+23}, --- > ["frameRight"] = {"main", 172, 3, 172+11, 3+23}, 507c507 < if button ~= "spectrumPress" then --- > if button ~= "spectrumPress" and button ~= "spectrumClose" then monsters\pets\followstate.lua 28,31d27 < if checkStuck() > 4 then < mcontroller.setPosition(targetPosition) < end < monsters\pets\groundpet.lua 3a4,8 > self.pathing.stuckTimer = 0 > self.pathing.maxStuckTime = 2 > > self.jumpCooldown = 0 > self.jumpMaxCooldown = 1 62a68,69 > > if not self.moved then resetPathing() end 91a99 > self.jumpCooldown = self.jumpCooldown - dt 132,139c140,148 < function checkStuck() < local newPos = mcontroller.position() < if newPos[1] == self.stuckPosition[1] and newPos[2] == self.stuckPosition[2] then < self.stuckCount = self.stuckCount + 1 < else < self.stuckCount = 0 < self.stuckPosition = newPos < end --- > -------------------------------------------------------------------------------- > -- draw lines to display the specified rect {x1, y1, x2, y2} in the specified color, optionally offset by basePos > function drawDebugRect(rect, color, basePos) > if basePos then rect = translate(rect, basePos) end > world.debugLine({rect[1], rect[2]}, {rect[1], rect[4]}, color) > world.debugLine({rect[1], rect[2]}, {rect[3], rect[2]}, color) > world.debugLine({rect[3], rect[4]}, {rect[1], rect[4]}, color) > world.debugLine({rect[3], rect[4]}, {rect[3], rect[2]}, color) > end 141c150,172 < return self.stuckCount --- > -------------------------------------------------------------------------------- > -- draw lines and points to show the current path > function drawDebugPath(goalDelta) > local position = mcontroller.position() > > local step = 0 > local prevStep = position > while true do > local nextStep = entity.pathLookahead(step) > if nextStep then > world.debugLine(prevStep, vec2.add(position, nextStep), "blue") > world.debugPoint(vec2.add(position, nextStep), "blue") > prevStep = vec2.add(position, nextStep) > step = step + 1 > else > break > end > end > if goalDelta then > local goalPosition = vec2.add(goalDelta, position) > world.debugLine(position, goalPosition, "green") > world.debugPoint(goalPosition, "green") > end 143a175 > 190c222 < -- opendoorCallback: function that will be passed a door entity id and should --- > -- openDoorCallback: function that will be passed a door entity id and should 202a235,240 > local toTargetPosition = world.distance(targetPosition, mcontroller.position()) > if math.abs(toTargetPosition[1]) < 2 and math.abs(toTargetPosition[2]) < 2 then > moveX(toTargetPosition[1], options.run) > return true > end > 289a328 > local goalPathNode = entity.pathLookahead(step) 291,294c330,333 < local nextPathDelta = entity.pathLookahead(step) < if nextPathDelta then < nextPathPosition = vec2.add(position, nextPathDelta) < goalPosition, forwardPosition, backwardPosition = findValidStandingPosition(nextPathPosition, util.toDirection(nextPathDelta[1])) --- > goalPathNode = entity.pathLookahead(step) > if goalPathNode then > nextPathPosition = vec2.add(position, goalPathNode) > goalPosition, forwardPosition, backwardPosition = findValidStandingPosition(nextPathPosition, util.toDirection(goalPathNode[1])) 296c335 < local nextDeltaDir = nextPathDelta[1] - delta[1] --- > local nextDeltaDir = goalPathNode[1] - delta[1] 302c341 < delta = nextPathDelta --- > delta = goalPathNode 314a354,366 > if checkPathStuck(dt, goalPathNode) then > return false > else > self.pathing.stuckTimer = self.pathing.stuckTimer + dt > end > > if self.debug then > world.debugLine(position, goalPosition, "green") > world.debugPoint(goalPosition, "green") > world.debugLine(position, vec2.add(position, delta), "yellow") > world.debugPoint(vec2.add(position, delta), "yellow") > end > 333a386 > self.pathing.deltaX = util.toDirection(goalDelta[1]) 353c406 < if verticalMovementRatio < 0.5 and math.abs(goalDelta[1]) > 1.5 then --- > if (verticalMovementRatio < 0.5 or goalDelta[2] > 0) and math.abs(goalDelta[1]) > 1.5 then 362a416,443 > --Edge case - jump over small bumps that aren't slopes > local bounds = boundingBox() > local groundTestRegion = { > position[1] - 0.95, position[2] + bounds[2] - 0.95, > position[1] - 0.05, position[2] + bounds[2] - 0.05 > } > local wallTestRegion = { > position[1] - 0.95, position[2] + bounds[2] + 0.05, > position[1] - 0.05, position[2] + bounds[2] + 0.95 > } > if deltaDir > 0 then > groundTestRegion[1] = groundTestRegion[1] + bounds[3] > groundTestRegion[3] = groundTestRegion[3] + bounds[3] > wallTestRegion[1] = groundTestRegion[1] + 1 > wallTestRegion[3] = groundTestRegion[3] + 1 > else > groundTestRegion[1] = groundTestRegion[1] + bounds[1] + 1 > groundTestRegion[3] = groundTestRegion[3] + bounds[1] + 1 > wallTestRegion[1] = groundTestRegion[1] - 1 > wallTestRegion[3] = groundTestRegion[3] - 1 > end > drawDebugRect(groundTestRegion, "blue") > drawDebugRect(wallTestRegion, "blue") > if verticalMovementRatio > 0.5 and not world.rectCollision(groundTestRegion, false) and world.rectCollision(wallTestRegion, false) then > timedJump(0.02, {position[1] + deltaDir * 2, position[2] + 1}) > return true > end > 395a477,482 > if self.jumpCooldown > 0 then > entity.setAnimationState("movement", "idle") > self.stuckCount = 0 > return true > end > 408a496 > self.jumpCooldown = self.jumpMaxCooldown 507c595 < position[1] + math.min(direction * math.max(-bounds[1], 1), 0) + 0.05, position[2] + bounds[2] - 0.95, --- > position[1] + math.min(direction * math.max(-bounds[1], 1), 0) + 0.05, position[2] + bounds[2] - 0.1, 511c599,603 < if (world.rectCollision(groundRegion, false) or world.liquidAt(position)) and collisionResolve then --- > if (world.rectCollision(groundRegion, false) or world.liquidAt(position)) and collisionResolve and > (world.material({groundRegion[1], groundRegion[2]}, "foreground") or world.material({groundRegion[3], groundRegion[4]}, "foreground")) then > if self.debug then > drawDebugRect(groundRegion, "blue") > end 521c613 < local validPosition, forwardPosition, backwardPosition = findValidStandingPosition({position[1], math.floor(position[2]) + y}, direction) --- > local validPosition, forwardPosition, backwardPosition = findValidStandingPosition({position[1], position[2] + y}, direction) 528c620 < local validPosition, forwardPosition, backwardPosition = findValidStandingPosition({position[1], math.ceil(position[2]) + y}, direction) --- > local validPosition, forwardPosition, backwardPosition = findValidStandingPosition({position[1], position[2] + y}, direction) 561,565c653,658 < -------------------------------------------------------------------------------- < -- draw lines and points to show the current path < function drawDebugPath(goalDelta) < local position = mcontroller.position() < --- > function checkPathStuck(dt, goalNode) > if self.pathing.stuckNode == nil then > self.pathing.stuckNode = vec2.add(mcontroller.position(), goalNode or entity.pathLookahead(0)) > end > > --Search path for stuck check node 567,573c660,667 < local prevStep = position < while true do < local nextStep = entity.pathLookahead(step) < if nextStep then < world.debugLine(prevStep, vec2.add(position, nextStep), "blue") < world.debugPoint(vec2.add(position, nextStep), "blue") < prevStep = vec2.add(position, nextStep) --- > local checkNode = nil > while step do > nextPathNode = entity.pathLookahead(step) > if nextPathNode then > nextPathNode = vec2.add(mcontroller.position(), nextPathNode) > if self.pathing.stuckNode[1] == nextPathNode[1] and self.pathing.stuckNode[2] == nextPathNode[2] then > checkNode = nextPathNode > end 576c670 < break --- > step = nil 579,582c673,679 < if goalDelta then < local goalPosition = vec2.add(goalDelta, position) < world.debugLine(position, goalPosition, "green") < world.debugPoint(goalPosition, "green") --- > > if checkNode then > --The node is still in the path meaning we haven't reached it yet. Maybe stuck > if self.pathing.stuckTimer > self.pathing.maxStuckTime then > return true > end > return false 583a681,690 > --The node is not in the path, we've probably passed it > self.pathing.stuckNode = nil > self.pathing.stuckTimer = 0 > > return false > end > > function resetPathing() > self.pathing.stuckNode = nil > self.pathing.stuckTimer = 0 monsters\pets\petcapturepod.lua 7,8c7,13 < local ownerUuid = entity.configParameter("ownerUuid", 0) < storage.ownerUuid = ownerUuid --- > local ownerUuid = entity.configParameter("ownerUuid") > if ownerUuid then > storage.ownerUuid = ownerUuid > world.spawnItem("capturepod", mcontroller.position(), 1) > else > storage.ownerUuid = 0 > end 17,18c22,39 < status.setResourcePercentage("health", 0) < return captured --- > > local captured = false > > if storage.ownerUuid ~= 0 then > if world.entityUuid(args.sourceId) == storage.ownerUuid then > captured = true > end > else > storage.ownerUuid = world.entityUuid(args.sourceId) > captured = true > end > > if captured then > status.setResourcePercentage("health", 0) > return true > else > return false > end 23a45,46 > if storage.ownerUuid == 0 then return false end > 37c60 < world.spawnItem("filledcapturepod", entity.toAbsolutePosition({ 0, 4 }), 1, { --- > world.spawnItem("filledcapturepod", mcontroller.position(), 1, { monsters\pets\cat\catbehavior.lua 12,16c12 < if storage.ownerUuid ~= 0 and storage.ownerUuid ~= entityDescription.uuid then < return catBehavior.reactToStranger(entityDescription) < < else < storage.ownerUuid = entityDescription.uuid --- > if storage.ownerUuid ~= 0 and storage.ownerUuid == entityDescription.uuid then 17a14,15 > else > return catBehavior.reactToStranger(entityDescription) 25d22 < world.logInfo("Start following %s", world.entityName(entityDescription.id)) objects\generic\tvstation\tvstation.object 3d2 < "interactAction" : "OpenStreamingVideoInterface", 14,15c13,14 < "description" : "Used to broadcast a video signal.", < "shortdescription" : "Streaming Station", --- > "description" : "Once used to broadcast a video signal.", > "shortdescription" : "TV Station", 18c17 < "apexDescription" : "I could broadcast live video with this.", --- > "apexDescription" : "I once could broadcast live video with this.", 20c19 < "floranDescription" : "Floran broadcassst to Twitch, become ccelebrity.", --- > "floranDescription" : "Floran ussssed to talk to flesssssh things on internets.", objects\mission\miningverticaldoor\miningverticaldoor.object 34c34 < "orientations" : [ --- > "orientations" : [ objects\outpost\customsign\customsign.object 25c25 < "imagePosition" : [-2, -2], --- > "imagePosition" : [-18, -2], 28c28 < [0, 0], [1, 0], [2,0] ,[3, 0] --- > [-2, 0], [-1, 0], [0,0] ,[1, 0] 48c48 < "animationPosition" : [0, 0], --- > "animationPosition" : [-16, 0], objects\outpost\signstore\customeasel-data.lua 34a35 > ["spectrumClose"]="Close color selector window", projectiles\boss\crystalboss\crystalshard1.projectile 14c14,15 < "damageKind" : "default" --- > "damageKind" : "default", > "onlyHitTerrain" : true projectiles\boss\crystalboss\crystalshard2.projectile 14c14,15 < "damageKind" : "default" --- > "damageKind" : "default", > "onlyHitTerrain" : true projectiles\boss\crystalboss\crystalshard3.projectile 14c14,15 < "damageKind" : "default" --- > "damageKind" : "default", > "onlyHitTerrain" : true projectiles\boss\crystalboss\crystalshard4.projectile 14c14,15 < "damageKind" : "default" --- > "damageKind" : "default", > "onlyHitTerrain" : true projectiles\boss\crystalboss\crystalshard5.projectile 14c14,15 < "damageKind" : "default" --- > "damageKind" : "default", > "onlyHitTerrain" : true projectiles\boss\crystalboss\crystalshard6.projectile 14c14,15 < "damageKind" : "default" --- > "damageKind" : "default", > "onlyHitTerrain" : true quests\outpost\phase1optional\floranfan1.questtemplate 5c5 < "text" : "Do you like my clothesss? I love human clothing! ^green;If you bring me a ^orange;cool human jacket ^green;I'll give you ssssomething nice!", --- > "text" : "Do you like my clothesss? I love human clothing! ^green;If you bring me a ^orange;cool jacket ^green;I'll give you ssssomething nice!", scripts\api\npchooks.lua 34d33 < -- "OpenStreamingVideoInterface" scripts\api\objecthooks.lua 24d23 < -- "OpenStreamingVideoInterface" treasure\biome.treasurepools 513c513 < {"weight" : 0.3, "item" : "tarchest-recipe"} --- > {"weight" : 0.3, "item" : "tarpitchest-recipe"} 990c990 < {"weight" : 0.3, "item" : "tarchest-recipe"} --- > {"weight" : 0.3, "item" : "tarpitchest-recipe"}