Last active
January 9, 2016 16:48
-
-
Save damc-dev/973fd19f7481b65d2b71 to your computer and use it in GitHub Desktop.
Reign of Kings Oxide Plugin to Update Player Positions to Firebase on interval
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<html> | |
<head> | |
<script src='https://cdn.firebase.com/js/client/2.2.1/firebase.js'></script> | |
<script src='https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js'></script> | |
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.12/d3.min.js"></script> | |
</head> | |
<body> | |
<script> | |
var mapMinX = -1000; | |
var mapMaxX = 700; | |
var mapMinY = -1300; | |
var mapMaxY = 700 | |
var canvasWidth = Math.abs(mapMinX - mapMaxX); | |
var canvasHeight = Math.abs(mapMinY - mapMaxY); | |
function adjustWidth(x) { | |
return Number(x) + Math.abs(mapMinX); | |
} | |
function adjustHeight(y) { | |
return Number(y) + Math.abs(mapMinY); | |
} | |
var svg = d3 | |
.select("body") | |
.append("svg") | |
.attr("width", canvasWidth) | |
.attr("height", canvasHeight) | |
.style("border", "1px solid black"); | |
var currentPlayers =[{playerId: "76561197973489358", playerName: "Dahveed", x: "-201.4521", y: "147.0072", z: "-791.7221"}]; | |
var pointsOfInterestData = [ | |
{name: "Throne", x: "-261.23", y: "271.298", z: "-1155.022"} | |
,{name: "Plague Village", x: "-343.0", y: "79.0", z: "-402.0"} | |
] | |
var pointsOfInterest = svg.selectAll("g.pointsOfInterest") | |
.data(pointsOfInterestData) | |
.enter().append("g") | |
.attr("class", "pointsOfInterest"); | |
console.log(pointsOfInterest) | |
pointsOfInterest.append("rect") | |
.attr("x", function(data) { return adjustWidth(Number(data.x)); }) | |
.attr("y", function(data) { return adjustHeight(Number(data.z)); }) | |
.attr("width", 20) | |
.attr("height", 20) | |
.style("fill", "green"); | |
pointsOfInterest.append("text") | |
.attr("x", function(data) { return adjustWidth(Number(data.x)); }) | |
.attr("y", function(data) { return adjustHeight(Number(data.z)); }) | |
.text( function (d) { return d.name; } ) | |
.attr("font-family", "sans-serif") | |
.attr("font-size", "18px") | |
.attr("fill", "black"); | |
function update(currentPlayers) { | |
var playerKeyFn = function(player) { return player.playerId; }; | |
// DATA JOIN | |
// Join new data with old elements, if any. | |
var players = svg.selectAll("circle.player") | |
.data(currentPlayers, playerKeyFn); | |
//var text = svg.selectAll("text").data(currentPlayers); | |
// UPDATE | |
// Update old elements as needed. | |
players.attr("class", "player") | |
.attr("cx", function(data) { return adjustWidth(Number(data.x)); }) | |
.attr("cy", function(data) { return adjustHeight(Number(data.z)); }) | |
.attr("r", 10) | |
.style("fill", "blue"); | |
//text.attr("class", "update"); | |
// ENTER | |
// Create new elements as needed. | |
players.enter().append("circle") | |
.attr("class", "player") | |
.attr("cx", function(data) { return adjustWidth(Number(data.x)); }) | |
.attr("cy", function(data) { return adjustHeight(Number(data.z)); }) | |
.attr("r", 10) | |
.style("fill", "blue"); | |
/* | |
text.enter() | |
.append("text") | |
.attr("x", function(data) { return adjustWidth(Number(data.x)); }) | |
.attr("y", function(data) { return adjustHeight(Number(data.z)); }) | |
.attr("class", "enter") | |
.attr("font-family", "sans-serif") | |
.attr("font-size", "20px") | |
.attr("fill", "black"); | |
*/ | |
// ENTER + UPDATE | |
// Appending to the enter selection expands the update selection to include | |
// entering elements; so, operations on the update selection after appending to | |
// the enter selection will apply to both entering and updating nodes. | |
players | |
.attr("cx", function(data) { return adjustWidth(Number(data.x)); }) | |
.attr("cy", function(data) { return adjustHeight(Number(data.z)); }) | |
/* | |
text.text(function(d) { return d.displayName; }) | |
.attr("x", function(data) { return adjustWidth(Number(data.x)); }) | |
.attr("y", function(data) { return adjustHeight(Number(data.z)); }); | |
*/ | |
// EXIT | |
// Remove old elements as needed. | |
players.exit().remove(); | |
//text.exit().remove(); | |
} | |
// initial display | |
update(currentPlayers); | |
var myDataRef = new Firebase('https://boiling-fire-6979.firebaseio.com/servers/MyServer'); | |
myDataRef.on('child_added', function(snapshot) { | |
//console.log(snapshot.val()); | |
var serverDetails = snapshot.val(); | |
if (serverDetails.playerDetails == undefined) { | |
currentPlayers = []; | |
} else { | |
currentPlayers = serverDetails.playerDetails; | |
} | |
console.log(currentPlayers); | |
update(currentPlayers); | |
/* | |
var circles = svgContainer.selectAll("circle") | |
.data(currentPlayers) | |
.enter() | |
.append("circle"); | |
var circleAttributes = circles | |
.attr("cx", function(data) { return (Number(data.x) + canvasWidth/2); }) | |
.attr("cy", function(data) { return (Number(data.y) + canvasHeight/2); }) | |
.attr("r", 20) | |
.style("fill", "green"); | |
var text = svgContainer.selectAll("text") | |
.data(currentPlayers) | |
.enter() | |
.append("text"); | |
var textLabels = text | |
.attr("x", function(d) { return Number(d.x) + canvasWidth/2; } ) | |
.attr("y", function(d) { return Number(d.y) + canvasHeight/2; } ) | |
.text( function (d) { return d.playerName; } ) | |
.attr("font-family", "sans-serif") | |
.attr("font-size", "20px") | |
.attr("fill", "black"); | |
*/ | |
/** | |
currentPlayers = serverDetails.playerDetails; | |
for (var i=0; i < currentPlayers.length; i++) { | |
console.log(currentPlayers[i]); | |
} | |
} | |
*/ | |
}); | |
</script> | |
</body> | |
</html> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections.Generic; | |
using System; | |
using System.Data; | |
using System.Reflection; | |
using Newtonsoft.Json; | |
using UnityEngine; | |
using Oxide.Core; | |
using Oxide.Core.Plugins; | |
using CodeHatch.Engine.Networking; | |
using CodeHatch.Common; | |
using CodeHatch.Permissions; | |
namespace Oxide.Plugins | |
{ | |
[Info("ReportPlayerPositions", "Dahveed", 0.1, ResourceId = 0)] | |
[Description(".")] | |
class ReportPlayerPositions : ReignOfKingsPlugin | |
{ | |
public static string datePatt = @"yyyy-MM-ddTHH:mm:ssZ"; | |
private const int DefaultRollCallInterval = 3; | |
public int RollCallInterval { get; private set; } | |
private const string DefaultServerMap = "StormWall"; | |
public string ServerMap { get; private set; } | |
private const string DefaultServerName = "MyServer"; | |
public string ServerName { get; private set; } | |
public class ServerDetails { | |
public string serverMap; | |
public string currentTime; | |
public List<PlayerDetail> playerDetails; | |
public ServerDetails(string map, List<PlayerDetail> players) { | |
serverMap = map; | |
currentTime = DateTime.UtcNow.ToString(datePatt); | |
playerDetails = players; | |
} | |
} | |
Permission permissions; | |
public class PlayerDetail { | |
public string playerId; | |
public string playerName; | |
public string x; | |
public string y; | |
public string z; | |
public PlayerDetail(Player player) { | |
playerId = player.Id.ToString(); | |
playerName = player.DisplayName.ToString(); | |
x = player.Entity.Position.x.ToString(); | |
y = player.Entity.Position.y.ToString(); | |
z = player.Entity.Position.z.ToString(); | |
} | |
public override string ToString() { | |
return JsonConvert.SerializeObject(this); | |
//return base.ToString() + " [ PlayerId: " + playerId + ", PlayerName: " + playerName + ", x: " + x + ", y: " + y + ", z: " + z + " ]"; | |
} | |
} | |
void OnServerInitialized() | |
{ | |
permissions = Server.Permissions; | |
} | |
void Loaded() | |
{ | |
timer.Repeat(10, 0, logPlayerCoordinates); | |
} | |
void logPlayerCoordinates() { | |
List<PlayerDetail> playerDetails = new List<PlayerDetail>(); | |
List<Player> onlineplayers = Server.ClientPlayers as List<Player>; | |
foreach (Player player in onlineplayers.ToArray()){ | |
PlayerDetail playerDetail = new PlayerDetail(player); | |
playerDetails.Add(playerDetail); | |
Puts(playerDetail.ToString()); | |
} | |
ServerDetails serverDetails = new ServerDetails("StormWall", playerDetails); | |
string requestBody = JsonConvert.SerializeObject(serverDetails); | |
Puts(requestBody); | |
webrequest.EnqueuePost( | |
"https://boiling-fire-6979.firebaseio.com/servers/" + DefaultServerName + ".json", | |
requestBody, | |
(code, response) => PostCallback(code, response), this); | |
} | |
; | |
void PostCallback(int code, string response) | |
{ | |
if (response == null || code != 200) | |
{ | |
Puts("Post was unsuccessful"); | |
return; | |
} | |
Puts("Post was successful"); | |
} | |
/* | |
WebRequest request = WebRequest.Create("https://boiling-fire-6979.firebaseio.com/servers/MyServer/players.json"); | |
request.ContentType = "text/json"; | |
request.Method = "PUT"; | |
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { | |
streamWriter.Write(JsonConvert.SerializeObject(playerDetails)); | |
} | |
*/ | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment