Skip to content

Instantly share code, notes, and snippets.

@damc-dev
Last active January 9, 2016 16:48
Show Gist options
  • Save damc-dev/973fd19f7481b65d2b71 to your computer and use it in GitHub Desktop.
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
<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>
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