Quickmarch
2010-09-17 11:42:17
Due to the update on 15/09/2010, TileToMS no longer works as jagex have partially updated their rendering system. They are now using small x, y, z (floats) modifiers to turn world coordinates into screen coordinates, removing the need for a bitshift.
Fixez:
All I have done is omit the ' / 16384.0' from TileToMS calculations and updated 'UpdateRenderInfo' to read floats instead of integers.
Fixez:
procedure UpdateRenderInfo(var Render : TRender; var RenderData : TRenderData);
var
tk, vp, t: Integer;
begin
MarkTime(t);
while ((RenderData.zX <= 0) and (RenderData.zY <= 0) and (TimeFromMark(t) < 10000)) do
begin
tk := SmartGetFieldObject(0, hook_static_Toolkit);
vp := SmartGetFieldObject(tk, hook_sdtoolkit_Viewport);
with RenderData do
begin
xOff := SmartGetFieldFloat(vp,hook_sdviewport_xOff);
xX :=SmartGetFieldFloat(vp,hook_sdviewport_xX);
xY := SmartGetFieldFloat(vp,hook_sdviewport_xY);
xZ := SmartGetFieldFloat(vp,hook_sdviewport_xZ);
yOff := SmartGetFieldFloat(vp,hook_sdviewport_yOff);
yX := SmartGetFieldFloat(vp,hook_sdviewport_yX);
yY := SmartGetFieldFloat(vp,hook_sdviewport_yY);
yZ := SmartGetFieldFloat(vp,hook_sdviewport_yZ);
zOff := SmartGetFieldFloat(vp,hook_sdviewport_zoff);
zX := SmartGetFieldFloat(vp,hook_sdviewport_zX);
zY := SmartGetFieldFloat(vp,hook_sdviewport_zY);
zZ := SmartGetFieldFloat(vp,hook_sdviewport_zZ);
end;
with Render do
begin
xScale := SmartGetFieldInt(tk, hook_sdtoolkit_xScale);
yScale := SmartGetFieldInt(tk, hook_sdtoolkit_yScale);
xMin := SmartGetFieldInt(tk, hook_sdtoolkit_xMin);
xMax := SmartGetFieldInt(tk, hook_sdtoolkit_xMax);
yMin := SmartGetFieldInt(tk, hook_sdtoolkit_yMin);
yMax := SmartGetFieldInt(tk, hook_sdtoolkit_yMax);
zMin := SmartGetFieldInt(tk, hook_sdtoolkit_zMin);
zMax := SmartGetFieldInt(tk, hook_sdtoolkit_zMax);
end;
SmartFreeObject(tk);
SmartFreeObject(vp);
end;
end;
function TileToMSEx(tile: TTile; offx, offy : extended; height : integer) : TPoint;
var
rd : TRenderData;
r : TRender;
pixelX, pixelY, pixelZ, x, y, z: extended;
tries: integer;
label
ProcStart;
begin;
ProcStart:
EmptyRenderInfo(r, rd);
pixelX := 0;
PixelY := 0;
pixelZ := 0;
x := 0;
y := 0;
z := 0;
Inc(tries);
result:= point(-1,-1);
UpdateRenderInfo(r,rd);
pixelX:= (tile.x - SmartGetFieldInt(0,hook_static_BaseX) + offX) * 512.0;
pixelY:= GetTileHeight(tile) - height;
pixelZ:= (tile.y - SmartGetFieldInt(0,hook_static_BaseY) + offY) * 512.0;
//Writeln('zX: '+ToStr(rd.zX));
//Writeln('zY: '+ToStr(rd.zY));
//Writeln('zZ: '+ToStr(rd.zZ));
z:= rd.zOff + (rd.zX * pixelX + rd.zY * pixelY + rd.zZ * pixelZ);
if ((z < r.zMin) or (z > r.zMax)) then
exit;
x:= r.xScale * (rd.xOff + (rd.xX * pixelX + rd.xY * pixelY + rd.xZ * pixelZ)) / z;
y:= r.yScale * (rd.yOff + (rd.yX * pixelX + rd.yY * pixelY + rd.yZ * pixelZ)) / z;
if ((x >= r.xMin) and (x <= r.xMax) and (y >= r.yMin) and (y <= r.yMax)) then
begin
result.x:= Round(x - r.xMin);
result.y:= Round(y - r.yMin);
if not PointInBox(Result, IntToBox(MSX1, MSY1, MSX2, MSY2))then
begin
Result.x := -1;
Result.y := -1;
end;
end else
begin
//Because sometimes the renderer is doing funny stuff, a single repeat will
//often fix this error, since it should work if it got this far.
if (tries > 30)then Exit;
goto ProcStart;
end;
end;
All I have done is omit the ' / 16384.0' from TileToMS calculations and updated 'UpdateRenderInfo' to read floats instead of integers.