Results -9 to 0 of 850

Dev. Posts

Threaded View

  1. #11
    Player
    Jpec07's Avatar
    Join Date
    Jul 2015
    Posts
    868
    Character
    Matthias Gendrin
    World
    Cactuar
    Main Class
    Paladin Lv 80
    For RMT reporting, adding the "Report RMT Activity" option to the right click context menu for targets would be extremely helpful. I've come across numerous bots while leveling recently, and there is no easy way to report their cheating. While I could open a ticket, there are some problems:
    • They use junk names which are hard to type.
    • Because of how fast they teleport around the map, I cannot isolate their names before they've moved.
    • Even if I took a screenshot, they usually stand on top of each other, so seeing their names is impossible.

    Fortunately, each of these has another simple QoL solution:
    • Add an option to copy a player's/target's name to the clipboard from the right click context menu for target players.
    • Add a piece of verification logic to the middleware endpoint for updating location that checks if a player could even actually move that quickly (I'll update this post in a few minutes with some example logic in JavaScript format).
      EDIT:
      Code:
      //	Position object class
      //	x, y, z as coordinates
      function Position(x, y, z)
      {
      	if(typeof(x) == "undefined" || !x
      	|| typeof(y) == "undefined" || !y
      	|| typeof(z) == "undefined" || !z)
      	{
      		return new Error("Position: must define x, y, and z as coordinates.");
      	}
      	const X = Number(x);
      	const Y = Number(y);
      	const Z = Number(z);
      	//	Setting the time: JavaScript returns milliseconds, but we only need to work in seconds (cuts down on calculation effort).
      	const Time = Math.floor(Date.now()/1000);
      	/*	function Position.validate()
      	 *
      	 *	Validates whether or not this position is acceptable within the constraints of the system.
      	 *
      	 *	@param oldPos (Position) - the old position to check against
      	 *	@param opt (Object) - The options for the validation. Required:
      	 *		dim: whether to use 2 or 3 dimensions in the rate calculation.
      	 *		maxRate: the max rate, as units of distance per second
      	 */
      	this.validate = function(oldPos, opt) {
      		//	First check if oldPos is a Position object, and opts have everything we need
      		if(!(oldPos instanceof Position))
      		{
      			console.error(new Error("Position.validate(): oldPos is not a position!"));
      			return false;
      		}
      		else
      		//	Next check if opt is valid
      		if(typeof(opt) != "Object"
      		|| !('dimensions' in opt)
      		|| !opt.dimensions
      		|| !('maxRate' in opt)
      		|| !opt.maxRate)
      		{
      			console.error(new Error("Position.validate(): Some required options missing.");
      			return false;
      		}
      		else
      		{
      			var deltaX = Math.abs(X - oldPos.getX()),
      				deltaY = Math.abs(Y - oldPos.getY()),
      				deltaZ = Math.abs(Z - oldPos.getZ()),
      				deltaTime = Math.abs(Time - oldPos.getTime());
      			var deltaXY = Math.sqrt(deltaX^2 + deltaY^2);
      			var deltaXYZ = Math.sqrt(deltaXY^2 + deltaZ^2);
      			var rate = 0;
      			if(opt.dim <= 2)
      			{
      				rate = deltaXY/deltaTime;
      			}
      			else
      			if(opt.dim >= 3)
      			{
      				rate = deltaXYZ/deltaTime;
      			}
      			//	Allowing some leniency for latency
      			if(rate > opt.maxRate*1.5)
      			{
      				return false;
      			}
      			else
      			{
      				return true;
      			}
      			
      		}
      	}
      	this.getX = function()
      	{
      		return X;
      	}
      	this.getY = function()
      	{
      		return Y;
      	}
      	this.getZ = function()
      	{
      		return Z;
      	}
      	this.getTime = function()
      	{
      		return Time;
      	}
      }
      
      //	On middleware call to register position, call this method:
      
      Character.prototype.setPos = function(x, y, z)
      {
      	var newPos = new Position(x, y, z);
      	if(newPos.validate(this.position, {"dim": 2, "maxRate": this.getMaxVelocity()}))
      	{
      		//	Position is valid, so update it on the Character.
      		this.position = newPos;
      	}
      	else
      	{
      		//	Position is invalid, so flag this character for scrutiny so the GMs can nuke their cheating arses from orbit.
      		this.flagForRMTReview();
      	}
      }
    • Add an option to the UI configuration to control how the behavior of overlapping status bars (e.g. overlap, cluster, list, etc.).

    All of these would make it easier for us to help the GMs and support staff combat the problems of botting and RMT, by neutering the ability of botters to generate the supply.
    (3)
    Last edited by Jpec07; 04-27-2017 at 04:21 AM.