FILES ----- [NEW] items\materials\black.matitem [NEW] items\materials\black.png monsters\groundmovement.lua monsters\boss\bossmonster.lua monsters\boss\missile\behavior.lua monsters\boss\tentaclecomet\behavior.lua monsters\boss\tentaclecometspore\behavior.lua monsters\crawling\crawlingmonster.lua monsters\flying\skills\flyingrangedswoopattack.lua monsters\ground\groundmonster.lua [NEW] monsters\ground\hugebiped\head\rhino\hugerhinohead.monsterpart [NEW] monsters\ground\hugebiped\head\rhino\hugerhinohead.png monsters\ground\skills\blinkattack.lua monsters\ground\skills\burrowspecial.lua monsters\pets\groundpet.lua monsters\swimming\swimmingmonster.lua monsters\unique\bugs\behavior.lua monsters\unique\giftmonster\behavior.lua monsters\unique\po\behavior.lua npcs\main.lua npcs\meleeattackstate.lua npcs\rangedattackstate.lua npcs\sitstate.lua npcs\wanderstate.lua npcs\guard\guardstate.lua objects\wired\ironbeacon\decoyprincess.lua objects\wired\ironbeacon\ironbeacon.lua objects\wired\ironbeacon\jellyboss.lua objects\wired\ironbeacon\robot.lua scripts\sensors.lua scripts\util.lua tech\automobile\car.lua tech\blink\blink.lua tech\boat\boat.lua tech\boat\boat.tech tech\groundsmash\groundsmash.lua tech\hoverbike\hoverbike.lua tech\mech\mech.lua tech\morphball\morphball.lua tech\skyrail\skyrail.lua [NEW] tiles\materials\black.material [NEW] tiles\materials\black.png DIFFS ----- monsters\groundmovement.lua 40c40 < if world.rectCollision(jumpRegion, true) then --- > if world.rectTileCollision(jumpRegion, true) then 54c54 < if not world.rectCollision(jumpClearanceRegion, true) then --- > if not world.rectTileCollision(jumpClearanceRegion, true) then 73c73 < if not world.rectCollision(gapRegion, false) then --- > if not world.rectTileCollision(gapRegion, false) then 88c88 < if world.rectCollision(blockedRect, true) then --- > if world.rectTileCollision(blockedRect, true) then monsters\boss\bossmonster.lua 225c225 < return world.lineCollision(lineStart, lineEnd, true) --- > return world.lineTileCollision(lineStart, lineEnd, true) 299c299 < self.isBlocked = not world.pointCollision({blockBlocks[1][1] - direction, blockBlocks[1][2] - 1}) --- > self.isBlocked = not world.pointTileCollision({blockBlocks[1][1] - direction, blockBlocks[1][2] - 1}) 304c304 < self.isBlocked = world.lineCollision(topLine[1], topLine[2]) --- > self.isBlocked = world.lineTileCollision(topLine[1], topLine[2]) 317,318c317,318 < world.lineCollision(fallLine[1], fallLine[2]) == false and < world.lineCollision({fallLine[1][1], fallLine[1][2] - 1}, {fallLine[2][1], fallLine[2][2] - 1}) == false --- > world.lineTileCollision(fallLine[1], fallLine[2]) == false and > world.lineTileCollision({fallLine[1][1], fallLine[1][2] - 1}, {fallLine[2][1], fallLine[2][2] - 1}) == false monsters\boss\missile\behavior.lua 130c130 < if world.lineCollision(lineStart, lineEnd, true) then --- > if world.lineTileCollision(lineStart, lineEnd, true) then monsters\boss\tentaclecomet\behavior.lua 309c309 < if world.rectCollision(bounds) then --- > if world.rectTileCollision(bounds) then monsters\boss\tentaclecometspore\behavior.lua 55,56c55,56 < not world.rectCollision(bounds, true) and < world.rectCollision(bounds, false) --- > not world.rectTileCollision(bounds, true) and > world.rectTileCollision(bounds, false) monsters\crawling\crawlingmonster.lua 333c333 < return world.rectCollision(floorCheckRegion, true) --- > return world.rectTileCollision(floorCheckRegion, true) 439c439 < if world.rectCollision(stepCheckRegion, true) then --- > if world.rectTileCollision(stepCheckRegion, true) then 468c468 < if world.rectCollision(wallCheckRegion, true) then --- > if world.rectTileCollision(wallCheckRegion, true) then 543c543 < if not world.rectCollision(floorCheckRegion, true) then --- > if not world.rectTileCollision(floorCheckRegion, true) then 551c551 < if world.rectCollision(convexCheckRegion, true) then --- > if world.rectTileCollision(convexCheckRegion, true) then 599c599 < self.isBlocked = not world.pointCollision({blockBlocks[1][1] - direction, blockBlocks[1][2] - 1}) --- > self.isBlocked = not world.pointTileCollision({blockBlocks[1][1] - direction, blockBlocks[1][2] - 1}) 604c604 < self.isBlocked = world.lineCollision(topLine[1], topLine[2]) --- > self.isBlocked = world.lineTileCollision(topLine[1], topLine[2]) 621,622c621,622 < world.lineCollision(fallLine[1], fallLine[2]) == false and < world.lineCollision({fallLine[1][1], fallLine[1][2] - 1}, {fallLine[2][1], fallLine[2][2] - 1}) == false --- > world.lineTileCollision(fallLine[1], fallLine[2]) == false and > world.lineTileCollision({fallLine[1][1], fallLine[1][2] - 1}, {fallLine[2][1], fallLine[2][2] - 1}) == false 759c759 < and (params.requireLos == false or world.lineCollision(approachPoint, newTargetPosition) == false) --space is in LoS of target --- > and (params.requireLos == false or world.lineTileCollision(approachPoint, newTargetPosition) == false) --space is in LoS of target 764c764 < local canStand = world.lineCollision(approachPoint, {approachPoint[1], startRect[2] + mcontroller.boundBox()[2]}, false) --- > local canStand = world.lineTileCollision(approachPoint, {approachPoint[1], startRect[2] + mcontroller.boundBox()[2]}, false) monsters\flying\skills\flyingrangedswoopattack.lua 11c11 < if world.lineCollision(self.position, forwardSensor, true) then --- > if world.lineTileCollision(self.position, forwardSensor, true) then 16c16 < if world.lineCollision(self.position, downSensor, true) then --- > if world.lineTileCollision(self.position, downSensor, true) then monsters\ground\groundmonster.lua 467c467 < self.isBlocked = not world.pointCollision({blockBlocks[1][1] - direction, blockBlocks[1][2] - 1}) --- > self.isBlocked = not world.pointTileCollision({blockBlocks[1][1] - direction, blockBlocks[1][2] - 1}) 472c472 < self.isBlocked = world.lineCollision(topLine[1], topLine[2]) --- > self.isBlocked = world.lineTileCollision(topLine[1], topLine[2]) 489,490c489,490 < world.lineCollision(fallLine[1], fallLine[2], false) == false and < world.lineCollision({fallLine[1][1], fallLine[1][2] - 1}, {fallLine[2][1], fallLine[2][2] - 1}, false) == false --- > world.lineTileCollision(fallLine[1], fallLine[2], false) == false and > world.lineTileCollision({fallLine[1][1], fallLine[1][2] - 1}, {fallLine[2][1], fallLine[2][2] - 1}, false) == false 649c649 < and (params.requireLos == false or world.lineCollision(approachPoint, newTargetPosition) == false) --space is in LoS of target --- > and (params.requireLos == false or world.lineTileCollision(approachPoint, newTargetPosition) == false) --space is in LoS of target 1077c1077 < if verticalMovementRatio > 0.5 and not world.rectCollision(groundTestRegion, false) and world.rectCollision(wallTestRegion, false) then --- > if verticalMovementRatio > 0.5 and not world.rectTileCollision(groundTestRegion, false) and world.rectTileCollision(wallTestRegion, false) then 1237c1237 < if (world.rectCollision(groundRegion, false) or world.liquidAt(position)) and collisionResolve and --- > if (world.rectTileCollision(groundRegion, false) or world.liquidAt(position)) and collisionResolve and 1276c1276 < return world.rectCollision(ceilingRegion, true) --- > return world.rectTileCollision(ceilingRegion, true) 1288c1288 < return world.rectCollision(groundRegion, true) --- > return world.rectTileCollision(groundRegion, true) monsters\ground\skills\blinkattack.lua 79,85c79 < local bounds = entity.configParameter("metaBoundBox") < local region = { < bounds[1] + targetPosition[1], < bounds[2] + targetPosition[2], < bounds[3] + targetPosition[1], < bounds[4] + targetPosition[2] < } --- > local collisionPoly = mcontroller.collisionPoly() 87a82 > 89,96c84,87 < local destinationRegion = { < region[1] + bounds[1] + direction * offsetX, < region[2], < region[3] + bounds[3], < region[4] < } < if not world.rectCollision(destinationRegion, true) then < return { targetPosition[1] + direction * offsetX, targetPosition[2] } --- > local destinationPosition = {targetPosition[1] + direction * offsetX, targetPosition[2]} > local resolvedPosition = world.resolvePolyCollision(collisionPoly, destinationPosition, 0.5) > if resolvedPosition then > return resolvedPosition monsters\ground\skills\burrowspecial.lua 43c43 < if world.lineCollision(upLine[1], upLine[2]) then --- > if world.lineTileCollision(upLine[1], upLine[2]) then 47c47 < canJumpUp = not world.lineCollision(overLine[1], overLine[2]) --- > canJumpUp = not world.lineTileCollision(overLine[1], overLine[2]) monsters\pets\groundpet.lua 330c330 < if world.lineCollision({position[1], position[2] + bounds[2] + 1.5}, { position[1] + boundsEdge + direction, position[2] + bounds[2] + 1.5}, true) then --- > if world.lineTileCollision({position[1], position[2] + bounds[2] + 1.5}, { position[1] + boundsEdge + direction, position[2] + bounds[2] + 1.5}, true) then 565c565 < if verticalMovementRatio > 0.5 and not world.rectCollision(groundTestRegion, false) and world.rectCollision(wallTestRegion, false) then --- > if verticalMovementRatio > 0.5 and not world.rectTileCollision(groundTestRegion, false) and world.rectTileCollision(wallTestRegion, false) then 725c725 < if (world.rectCollision(groundRegion, false) or world.liquidAt(position)) and collisionResolve and --- > if (world.rectTileCollision(groundRegion, false) or world.liquidAt(position)) and collisionResolve and 767c767 < return world.rectCollision(ceilingRegion, true) --- > return world.rectTileCollision(ceilingRegion, true) 779c779 < return world.rectCollision(groundRegion, true) --- > return world.rectTileCollision(groundRegion, true) monsters\swimming\swimmingmonster.lua 131c131 < if world.pointCollision(entity.toAbsolutePosition(vec2.rotate(sensor, self.rotation)), true) then --- > if world.pointTileCollision(entity.toAbsolutePosition(vec2.rotate(sensor, self.rotation)), true) then monsters\unique\bugs\behavior.lua 32c32 < if world.lineCollision(position, minGroundLine, true) or world.liquidAt(minGroundLine) then --- > if world.lineTileCollision(position, minGroundLine, true) or world.liquidAt(minGroundLine) then 34c34 < elseif not world.lineCollision(position, maxGroundLine, true) or not world.liquidAt(maxGroundLine) then --- > elseif not world.lineTileCollision(position, maxGroundLine, true) or not world.liquidAt(maxGroundLine) then monsters\unique\giftmonster\behavior.lua 61c61 < if world.rectCollision(bounds, true) then --- > if world.rectTileCollision(bounds, true) then monsters\unique\po\behavior.lua 131c131 < return world.rectCollision(groundRegion, true) --- > return world.rectTileCollision(groundRegion, true) npcs\main.lua 68c68 < if world.rectCollision(supportRegion, true) then --- > if world.rectTileCollision(supportRegion, true) then 79c79 < if world.rectCollision(supportRegion, false) then --- > if world.rectTileCollision(supportRegion, false) then 901c901 < if (world.rectCollision(groundRegion, false) or world.liquidAt(position)) and collisionResolve then --- > if (world.rectTileCollision(groundRegion, false) or world.liquidAt(position)) and collisionResolve then 936c936 < return world.rectCollision(ceilingRegion, true) --- > return world.rectTileCollision(ceilingRegion, true) 948c948 < return world.rectCollision(groundRegion, true) --- > return world.rectTileCollision(groundRegion, true) npcs\meleeattackstate.lua 297c297 < return not world.rectCollision(otherSideRegion, true) --- > return not world.rectTileCollision(otherSideRegion, true) npcs\rangedattackstate.lua 160,161c160,161 < return world.lineCollision({ position[1], position[2] + entity.configParameter("rangedAttack.coverYOffset") }, targetPosition, true) and < not world.lineCollision({ position[1], position[2] + entity.configParameter("rangedAttack.coverYClearanceOffset") }, targetPosition, true) --- > return world.lineTileCollision({ position[1], position[2] + entity.configParameter("rangedAttack.coverYOffset") }, targetPosition, true) and > not world.lineTileCollision({ position[1], position[2] + entity.configParameter("rangedAttack.coverYClearanceOffset") }, targetPosition, true) 167c167 < return not world.lineCollision(coverPosition, coverEndpoint, true) --- > return not world.lineTileCollision(coverPosition, coverEndpoint, true) npcs\sitstate.lua 36c36 < if world.magnitude(toTarget) < entity.configParameter("sit.sitRadius") and not world.lineCollision(position, targetPosition, true) then --- > if world.magnitude(toTarget) < entity.configParameter("sit.sitRadius") and not world.lineTileCollision(position, targetPosition, true) then npcs\wanderstate.lua 116,117c116,117 < math.floor(position[1] + 0.5) - 1 + stateData.direction, math.floor(position[2] + 0.5), < math.floor(position[1] + 0.5) + 1 + stateData.direction, math.floor(position[2] + 0.5) + 1, --- > math.floor(position[1] + 0.5) - 1 + stateData.direction, math.floor(position[2] + 0.5) - 2, > math.floor(position[1] + 0.5) + 1 + stateData.direction, math.floor(position[2] + 0.5) - 1 119c119 < if world.rectCollision(region, true) then --- > if world.rectTileCollision(region, true) then 131c131 < if mcontroller.onGround() and not world.rectCollision(groundSupportRegion, true) then --- > if mcontroller.onGround() and not onSolidGround() then npcs\guard\guardstate.lua 146c146 < if not world.lineCollision(position, vec2.add({ -direction * entity.configParameter("guard.wallCheckDistance"), 0 }, position), true) then --- > if not world.lineTileCollision(position, vec2.add({ -direction * entity.configParameter("guard.wallCheckDistance"), 0 }, position), true) then objects\wired\ironbeacon\decoyprincess.lua 16c16 < return not world.rectCollision(bounds, true) --- > return not world.rectTileCollision(bounds, true) objects\wired\ironbeacon\ironbeacon.lua 16c16 < return not world.rectCollision(bounds, true) --- > return not world.rectTileCollision(bounds, true) objects\wired\ironbeacon\jellyboss.lua 16c16 < return not world.rectCollision(bounds, true) --- > return not world.rectTileCollision(bounds, true) objects\wired\ironbeacon\robot.lua 16c16 < return not world.rectCollision(bounds, true) --- > return not world.rectTileCollision(bounds, true) scripts\sensors.lua 29c29 < return world.pointCollision(position, true) --- > return world.pointTileCollision(position, true) 32c32 < return world.lineCollision(mcontroller.position(), position, true) --- > return world.lineTileCollision(mcontroller.position(), position, true) scripts\util.lua 15c15 < if world.pointCollision(entity.toAbsolutePosition(sensor), true) then --- > if world.pointTileCollision(entity.toAbsolutePosition(sensor), true) then tech\automobile\car.lua 9a10,11 > > self.collisionPoly = mcontroller.baseParameters().standingPoly 13a16,19 > local transformPosition = transformPoly(self.collisionPoly) > if transformPosition then > mcontroller.setPosition(transformPosition) > end 37,42c43,45 < local carCollisionTest = tech.parameter("carCollisionTest") < carCollisionTest[1] = carCollisionTest[1] + mcontroller.position()[1] < carCollisionTest[2] = carCollisionTest[2] + mcontroller.position()[2] < carCollisionTest[3] = carCollisionTest[3] + mcontroller.position()[1] < carCollisionTest[4] = carCollisionTest[4] + mcontroller.position()[2] < if not world.rectCollision(carCollisionTest) and tech.consumeTechEnergy(self.energyCostPerSecond * args.dt) then --- > local transformPosition = transformPoly(self.carCustomMovementParameters.standingPoly) > if transformPosition and tech.consumeTechEnergy(self.energyCostPerSecond * args.dt) then > mcontroller.setPosition(transformPosition) 47a51,54 > local transformPosition = transformPoly(self.collisionPoly) > if transformPosition then > mcontroller.setPosition(transformPosition) > end 109a117,132 > end > > function transformPoly(toPoly) > local position = mcontroller.position() > local yAdjust = collisionBottom(mcontroller.collisionPoly()) - collisionBottom(toPoly) > return world.resolvePolyCollision(toPoly, {position[1], position[2] + yAdjust}, 1) > end > > function collisionBottom(collisionPoly) > local lowest = 0 > for _,point in pairs(collisionPoly) do > if point[2] < lowest then > lowest = point[2] > end > end > return lowest tech\blink\blink.lua 1,10d0 < function checkCollision(position) < local boundBox = mcontroller.boundBox() < boundBox[1] = boundBox[1] - mcontroller.position()[1] + position[1] < boundBox[2] = boundBox[2] - mcontroller.position()[2] + position[2] < boundBox[3] = boundBox[3] - mcontroller.position()[1] + position[1] < boundBox[4] = boundBox[4] - mcontroller.position()[2] + position[2] < < return not world.rectCollision(boundBox) < end < 51c41 < if not position or world.lineCollision(mcontroller.position(), position, true) then --- > if not position or world.lineTileCollision(mcontroller.position(), position, true) then 61c51 < if world.pointCollision(checkPosition, false) then --- > if world.pointTileCollision(checkPosition, false) then 77,80d66 < if doCollisionCheck and not checkCollision(position) then < return nil < end < 130c116 < if args.actions["blink"] and self.mode == "none" and tech.consumeTechEnergy(energyUsage) then --- > if args.actions["blink"] and self.mode == "none" then 147c133 < if blinkPosition then --- > if blinkPosition and tech.consumeTechEnergy(energyUsage) then tech\boat\boat.lua 12a13 > self.collisionPoly = mcontroller.baseParameters().standingPoly 17a19,28 > function uninit() > if self.active then > local transformPosition = transformPoly(self.collisionPoly) > if transformPosition then > mcontroller.setPosition(transformPosition) > end > deactivate() > end > end > 58c69,73 < if world.resolvePolyCollision(collisionPoly, mcontroller.position(), 1) and tech.consumeTechEnergy(tech.parameter("energyUsage")) then --- > local yAdjust = collisionBottom(mcontroller.collisionPoly()) - collisionBottom(boatMovementParameters.standingPoly) > local position = mcontroller.position() > local resolvedPosition = world.resolvePolyCollision(boatMovementParameters.standingPoly, {position[1], position[2] + yAdjust}, 1) > if resolvedPosition and tech.consumeTechEnergy(tech.parameter("energyUsage")) then > mcontroller.setPosition(resolvedPosition) 163c178,194 < end \ No newline at end of file --- > end > > function transformPoly(toPoly) > local position = mcontroller.position() > local yAdjust = collisionBottom(mcontroller.collisionPoly()) - collisionBottom(toPoly) > return world.resolvePolyCollision(toPoly, {position[1], position[2] + yAdjust}, 1) > end > > function collisionBottom(collisionPoly) > local lowest = 0 > for _,point in pairs(collisionPoly) do > if point[2] < lowest then > lowest = point[2] > end > end > return lowest > end tech\boat\boat.tech 11d10 < "collisionPoly" : [[-1.875, -4], [-5, -1.125], [-0.75, -1.125], [-0.75, 0.65], [-0.35, 1.22], [0.35, 1.22], [0.75, 0.65], [0.75, -1.125], [5, -1.125], [1.875, -4]], tech\groundsmash\groundsmash.lua 66c66 < if distance < knockbackRadius and not world.lineCollision(position, entityPosition) then --- > if distance < knockbackRadius and not world.lineTileCollision(position, entityPosition) then tech\hoverbike\hoverbike.lua 9a10,11 > > self.collisionPoly = mcontroller.baseParameters().standingPoly 13a16,19 > local transformPosition = transformPoly(self.collisionPoly) > if transformPosition then > mcontroller.setPosition(transformPosition) > end 37,42c43,45 < local carCollisionTest = tech.parameter("carCollisionTest") < carCollisionTest[1] = carCollisionTest[1] + mcontroller.position()[1] < carCollisionTest[2] = carCollisionTest[2] + mcontroller.position()[2] < carCollisionTest[3] = carCollisionTest[3] + mcontroller.position()[1] < carCollisionTest[4] = carCollisionTest[4] + mcontroller.position()[2] < if not world.rectCollision(carCollisionTest) and tech.consumeTechEnergy(self.energyCostPerSecond * args.dt) then --- > local transformPosition = transformPoly(self.carCustomMovementParameters.standingPoly) > if transformPosition and tech.consumeTechEnergy(self.energyCostPerSecond * args.dt) then > mcontroller.setPosition(transformPosition) 47a51,54 > local transformPosition = transformPoly(self.collisionPoly) > if transformPosition then > mcontroller.setPosition(transformPosition) > end 109a117,132 > end > > function transformPoly(toPoly) > local position = mcontroller.position() > local yAdjust = collisionBottom(mcontroller.collisionPoly()) - collisionBottom(toPoly) > return world.resolvePolyCollision(toPoly, {position[1], position[2] + yAdjust}, 1) > end > > function collisionBottom(collisionPoly) > local lowest = 0 > for _,point in pairs(collisionPoly) do > if point[2] < lowest then > lowest = point[2] > end > end > return lowest tech\mech\mech.lua 8a9 > self.collisionPoly = mcontroller.baseParameters().standingPoly 13,19c14,18 < local mechTransformPositionChange = tech.parameter("mechTransformPositionChange") < mcontroller.translate({-mechTransformPositionChange[1], -mechTransformPositionChange[2]}) < tech.setParentOffset({0, 0}) < self.active = false < tech.setVisible(false) < tech.setParentState() < tech.setToolUsageSuppressed(false) --- > local transformPosition = transformPoly(self.collisionPoly) > if transformPosition then > mcontroller.setPosition(transformPosition) > end > deactivate() 43d41 < local mechTransformPositionChange = tech.parameter("mechTransformPositionChange") 54a53,55 > local mechCollisionPoly = mechCustomMovementParameters.standingPoly > local position = mcontroller.position() > 60,70c61,65 < mechCollisionTest[1] = mechCollisionTest[1] + mcontroller.position()[1] < mechCollisionTest[2] = mechCollisionTest[2] + mcontroller.position()[2] < mechCollisionTest[3] = mechCollisionTest[3] + mcontroller.position()[1] < mechCollisionTest[4] = mechCollisionTest[4] + mcontroller.position()[2] < if not world.rectCollision(mechCollisionTest) and tech.consumeTechEnergy(energyCostPerSecond * args.dt) then < tech.burstParticleEmitter("mechActivateParticles") < mcontroller.translate(mechTransformPositionChange) < tech.setVisible(true) < tech.setParentState("sit") < tech.setToolUsageSuppressed(true) < self.active = true --- > local yAdjust = collisionBottom(mcontroller.collisionPoly()) - collisionBottom(mechCollisionPoly) > local transformPosition = transformPoly(mechCollisionPoly) > if transformPosition and tech.consumeTechEnergy(energyCostPerSecond * args.dt) then > mcontroller.setPosition(transformPosition) > activate() 75,81c70,74 < tech.burstParticleEmitter("mechDeactivateParticles") < mcontroller.translate({-mechTransformPositionChange[1], -mechTransformPositionChange[2]}) < tech.setVisible(false) < tech.setParentState() < tech.setToolUsageSuppressed(false) < tech.setParentOffset({0, 0}) < self.active = false --- > local transformPosition = transformPoly(self.collisionPoly) > if transformPosition then > mcontroller.setPosition(transformPosition) > end > deactivate() 148a142,174 > end > > function activate() > tech.burstParticleEmitter("mechActivateParticles") > tech.setVisible(true) > tech.setParentState("sit") > tech.setToolUsageSuppressed(true) > self.active = true > end > > function deactivate() > tech.burstParticleEmitter("mechDeactivateParticles") > tech.setVisible(false) > tech.setParentState() > tech.setToolUsageSuppressed(false) > tech.setParentOffset({0, 0}) > self.active = false > end > > function transformPoly(toPoly) > local position = mcontroller.position() > local yAdjust = collisionBottom(mcontroller.collisionPoly()) - collisionBottom(toPoly) > return world.resolvePolyCollision(toPoly, {position[1], position[2] + yAdjust}, 1) > end > > function collisionBottom(collisionPoly) > local lowest = 0 > for _,point in pairs(collisionPoly) do > if point[2] < lowest then > lowest = point[2] > end > end > return lowest tech\morphball\morphball.lua 6a7,8 > > self.collisionPoly = mcontroller.baseParameters().standingPoly 11,15c13,17 < tech.setVisible(false) < mcontroller.translate({0, -tech.parameter("ballTransformHeightChange")}) < tech.setParentDirectives() < tech.setToolUsageSuppressed(false) < self.active = false --- > local transformPosition = transformPoly(self.collisionPoly) > if transformPosition then > mcontroller.setPosition(transformPosition) > end > deactivate() 43,48c45,49 < tech.setVisible(true) < tech.burstParticleEmitter("morphballActivateParticles") < mcontroller.translate({0, ballTransformHeightChange}) < tech.setParentDirectives("?multiply=00000000") < tech.setToolUsageSuppressed(true) < self.active = true --- > local transformPosition = transformPoly(ballCustomMovementParameters.standingPoly) > if transformPosition then > mcontroller.setPosition(transformPosition) > activate() > end 50,61c51,56 < ballDeactivateCollisionTest[1] = ballDeactivateCollisionTest[1] + mcontroller.position()[1] < ballDeactivateCollisionTest[2] = ballDeactivateCollisionTest[2] + mcontroller.position()[2] < ballDeactivateCollisionTest[3] = ballDeactivateCollisionTest[3] + mcontroller.position()[1] < ballDeactivateCollisionTest[4] = ballDeactivateCollisionTest[4] + mcontroller.position()[2] < if not world.rectCollision(ballDeactivateCollisionTest) then < tech.setVisible(false) < tech.burstParticleEmitter("morphballDeactivateParticles") < mcontroller.translate({0, -ballTransformHeightChange}) < tech.setParentDirectives() < tech.setToolUsageSuppressed(false) < self.angle = 0 < self.active = false --- > local position = mcontroller.position() > local resolvedPosition = world.resolvePolyCollision(self.collisionPoly, {position[1], position[2] -ballTransformHeightChange}, 1) > local transformPosition = transformPoly(self.collisionPoly) > if transformPosition then > mcontroller.setPosition(transformPosition) > deactivate() 82a78,110 > end > > function activate() > tech.setVisible(true) > tech.burstParticleEmitter("morphballActivateParticles") > tech.setParentDirectives("?multiply=00000000") > tech.setToolUsageSuppressed(true) > self.active = true > end > > function deactivate() > tech.setVisible(false) > tech.burstParticleEmitter("morphballDeactivateParticles") > tech.setParentDirectives() > tech.setToolUsageSuppressed(false) > self.angle = 0 > self.active = false > end > > function transformPoly(toPoly) > local position = mcontroller.position() > local yAdjust = collisionBottom(mcontroller.collisionPoly()) - collisionBottom(toPoly) > return world.resolvePolyCollision(toPoly, {position[1], position[2] + yAdjust}, 1) > end > > function collisionBottom(collisionPoly) > local lowest = 0 > for _,point in pairs(collisionPoly) do > if point[2] < lowest then > lowest = point[2] > end > end > return lowest tech\skyrail\skyrail.lua 444c444 < if world.lineCollision(lineStart,lineEnd,false) then --- > if world.lineTileCollision(lineStart,lineEnd,false) then