protected override void ActOnTile(Vector3Int worldPos, Vector3 dir) { var matrix = MatrixManager.AtPoint(worldPos, true); var pos = (worldPos - registerObj.WorldPositionServer).sqrMagnitude; //Greater than 4 means more than one tile away if (pos > 4) { //Attack adjacent tiles instead var normalised = (worldPos - registerObj.WorldPositionServer).Normalize(); var posShift = registerObj.WorldPositionServer; var xSuccess = false; //x must be either -1, or 1 for us to attack it if (normalised.x != 0) { posShift.x += normalised.x; //Check for the tiles on the x tile xSuccess = CheckTile(true); //Check for impassable objects to hit on the x tile if (TryAttackObjects(posShift, dir)) { return; } } //x must have failed and y must be either -1, or 1 for us to attack it if (xSuccess == false && normalised.y != 0) { //Remove x change and then add y change posShift.x -= normalised.x; posShift.y += normalised.y; //Check for impassable objects to hit first before tile if (TryAttackObjects(posShift, new Vector3(0, normalised.y, 0))) { return; } if (CheckTile() == false) { //Else nothing to attack, x and y failed so stop return; } } bool CheckTile(bool isX = false) { dir = new Vector3(isX ? normalised.x : 0, isX ? 0 : normalised.y, 0); if (MatrixManager.IsWindowAt(posShift, true) || MatrixManager.IsGrillAt(posShift, true)) { worldPos = posShift; return(true); } return(false); } } else { //This is the target tile so check for impassable objects to hit before attacking tile if (TryAttackObjects(worldPos, dir)) { return; } } matrix.MetaTileMap.ApplyDamage(MatrixManager.WorldToLocalInt(worldPos, matrix), hitDamage * 2, worldPos); ServerDoLerpAnimation(dir); }