Skip to content

Commit 13a0b3d

Browse files
committed
Add tree reachability check to woodcutting logic.
Implemented a `canReachTree` method to ensure players can access trees before starting woodcutting. This includes adding clipping checks and an object retrieval method in `Region` to handle object positioning and validation.
1 parent 7f1dc47 commit 13a0b3d

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

2006Scape Server/src/main/java/com/rs2/game/content/skills/woodcutting/Woodcutting.java

+40
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@
1010
import com.rs2.game.content.skills.SkillHandler;
1111
import com.rs2.game.items.DeprecatedItems;
1212
import com.rs2.game.objects.Object;
13+
import com.rs2.game.objects.Objects;
1314
import com.rs2.game.players.Player;
1415
import com.rs2.game.players.PlayerHandler;
1516
import com.rs2.util.Misc;
17+
import com.rs2.world.clip.Region;
1618

1719
public class Woodcutting {
1820

@@ -227,6 +229,41 @@ public static boolean hasAxe(Player player) {
227229
return false;
228230
}
229231

232+
private static boolean canReachTree(Player p, int treeX, int treeY, int id) {
233+
int pointerOffsetX = p.getMapRegionX();
234+
int pointerOffsetY = p.getMapRegionY();
235+
236+
int treeRelX = treeX - (pointerOffsetX << 3);
237+
int treeRelY = treeY - (pointerOffsetY << 3);
238+
int playerOffsetX = p.getX() - (pointerOffsetX << 3);
239+
int playerOffsetY = p.getY() - (pointerOffsetY << 3);
240+
241+
Region region = Region.getRegion(p.getX(), p.getY());
242+
int clipping = region.getClipping(p.getX(), p.getY(), p.heightLevel);
243+
244+
Objects tree = region.GetObjectAt(treeX, treeY, id);
245+
246+
int treeclipping = region.getClipping(treeX, treeY, p.heightLevel);
247+
248+
boolean reached = Region.reachedObject(playerOffsetX,
249+
playerOffsetY,
250+
treeRelX,
251+
treeRelY,
252+
tree.getObjectSize()[0],
253+
tree.getObjectSize()[1],
254+
treeclipping,
255+
clipping);
256+
257+
p.getPacketSender().sendMessage("Clipping: " + clipping);
258+
p.getPacketSender().sendMessage("Reached: " + reached);
259+
260+
if (!reached) {
261+
p.getPacketSender().sendMessage("Can't reach the tree from here.");
262+
}
263+
264+
return reached;
265+
}
266+
230267
public static void startWoodcutting(final Player p, final int objectId, final int x, final int y, final int type) {
231268
CycleEventHandler.getSingleton().stopEvents(p, "WoodcuttingEvent".hashCode());
232269
if (p.isWoodcutting || p.isFletching || p.isFiremaking || p.playerIsFletching) {
@@ -244,6 +281,9 @@ public static void startWoodcutting(final Player p, final int objectId, final in
244281
p.woodcuttingAxe = -1;
245282
treeData tree = treeData.getTree(objectId);
246283
p.turnPlayerTo(x, y);
284+
285+
if (!canReachTree(p, x, y, objectId)) return;
286+
247287
if (tree.getLevelReq() > wcLevel) {
248288
p.getPacketSender().sendMessage("You need a Woodcutting level of " + tree.getLevelReq() + " to cut this tree.");
249289
return;

2006Scape Server/src/main/java/com/rs2/world/clip/Region.java

+40
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,17 @@ else if (!objectExists(objectId, x, y, height))
649649
}
650650
}
651651

652+
public Objects GetObjectAt(int x, int y, int id)
653+
{
654+
for (Objects o : realObjects) {
655+
if (o.objectX == x && o.objectY == y && o.objectId == id) {
656+
return o;
657+
}
658+
}
659+
660+
return null;
661+
}
662+
652663
public static int getClipping(int x, int y, int height) {
653664
if (height > 3) {
654665
height = 0; //this doesn't seem good
@@ -716,4 +727,33 @@ public static boolean getClipping(int x, int y, int height, int moveTypeX,
716727
}
717728
}
718729

730+
public static boolean reachedObject(int startX, int startY, int endX, int endY, int endDistanceX, int endDistanceY,
731+
int surroundings, int clipping)
732+
{
733+
int endX2 = (endX + endDistanceX) - 1;
734+
int endY2 = (endY + endDistanceY) - 1;
735+
736+
if (startX >= endX && startX <= endX2 && startY >= endY && startY <= endY2)
737+
{
738+
return true;
739+
}
740+
741+
if (startX == endX - 1 && startY >= endY && startY <= endY2
742+
&& (clipping & 8) == 0 && (surroundings & 8) == 0)
743+
{
744+
return true;
745+
}
746+
747+
if (startX == endX2 + 1 && startY >= endY && startY <= endY2
748+
&& (clipping & 0x80) == 0 && (surroundings & 2) == 0)
749+
{
750+
return true;
751+
}
752+
753+
return startY == endY - 1 && startX >= endX && startX <= endX2
754+
&& (clipping & 2) == 0 && (surroundings & 4) == 0
755+
|| startY == endY2 + 1 && startX >= endX && startX <= endX2
756+
&& (clipping & 0x20) == 0 && (surroundings & 1) == 0;
757+
}
758+
719759
}

0 commit comments

Comments
 (0)