My WIP that I really need help on!!!

Damian Knight

New Member
Member
Aug 14, 2014
9
0
1
New York
So to personally mod my server to make it how I want it to be I have begun making or revitalizing some mods to have the desired functions I want....

buuuuuuuuut I suck I am very new to this modding thing and so I really could use help with some one looking over these scripts and tell me what is wrong!!!


First
JavaScript:
var PLUGIN_ALLOW_JOIN_WITHOUT_LEAVING_FIRST = false;
var PLUGIN_SHOULD_LOG_ROOMS = true;
var PLUGIN_REMOVE_EMPTY_ROOMS = true;
var PLUGIN_DISPLAY_JOIN_LEAVE_MESSAGES = true;
var PLUGIN_NOT_ALLOWED_ROOMNAMES = ["Admin", "Admin-Chat", "Admin Chat", "ALL", "ALL-Chat", "ALL Chat"];




var chatrooms_tbl = "com.eightd.chatrooms.rooms";
var chatrooms_owner_tbl = "com.eightd.chatrooms.owner";
var chatrooms_player_to_room_tbl = "com.eightd.chatrooms.playertoroom";

var CURRENT_PLAYER_REMOVED_CHATROOM = 0;
var OTHER_PLAYER_REMOVED_CHATROOM = 1;
var CURRENT_PLAYER_LEFT_CHATROOM_BY_COMMAND = 2;
var CURRENT_PLAYER_LEFT_CHATROOM_BY_DISCONNECT = 3;




function On_Chat(Player, ChatString) {
    var sendtoall = false;
    var text = ChatString.Substring(1, ChatString.NewText.Length - 2);
    if(dataStoreContainsKey(chatrooms_player_to_room_tbl, Player.SteamID)) {
        var roomname = Datastore.Get(chatrooms_player_to_room_tbl, Player.SteamID);
        roomname = Data.ToLower(roomname);
        if(dataStoreContainsKey(chatrooms_tbl, roomname)) {
            var Room = castBackToObject(Datastore.Get(chatrooms_tbl, roomname));
            if(Data.StrLen(text) > 0) {
                sendChatroomMessage(Player, Room, text);
                Player.MessageFrom("[" + Room.Name + "]", Player.Name + ":" + text);
            }
            sendtoall = false;
        }
        else {
            Datastore.Remove(chatrooms_player_to_room_tbl, Player.SteamID);
            Datastore.Save();
            Player.Message("[ERROR]: Chatroom not found, you are back in the all-chat!");
            sendtoall = false;
        }
    }
    else {
        sendtoall = true;
    }
    if(sendtoall) {
        Server.BroadcastFrom("[ALL - " + Player.Name + "]", text);
    }
    ChatString.NewText = ""; // disable normal chat
}


function On_Command(Player, cmd, args) {
    if(cmd == "createroom") {
        var string = "";
        for(var str in args) {
            string += str + " ";
        }
        var myargs = Data.SplitQuoteStrings(string);
        if(myargs.Length != 3) {
            Player.Message("Useage: /createroom \"name\" \"password\" maxplayers");
            return;
        }
        var Room = {};
        Room.Name = myargs[0];
        Room.Owner = Player.SteamID;
        Room.Password = myargs[1];
        Room.Players = 0;
        Room.MaxPlayers = parseInt(myargs[2]);
        CreateChatRoomForPlayer(Player, Room);
  
    }
    else if(cmd == "removeroom") {
        if(!dataStoreContainsKey(chatrooms_player_to_room_tbl, Player.SteamID)) {
            Player.Message("Chatroom removed!");
        }
        RemovePlayerChatRoom(Player);
    }
    else if(cmd == "leaveroom") {
        if(!dataStoreContainsKey(chatrooms_player_to_room_tbl, Player.SteamID)) {
            Player.Message("You aren't in a chatroom! Join one! /joinroom \"name\” \"password\"");
            return;
        }
        var roomname = Datastore.Get(chatrooms_player_to_room_tbl, Player.SteamID);
        roomname = Data.ToLower(roomname);
        if(!dataStoreContainsKey(chatrooms_tbl, roomname)) {
            Player.Message("[ERROR]: Chatroom not found");
            Datastore.Remove(chatrooms_player_to_room_tbl, Player.SteamID);
            Datastore.Save();
            return;
        }
        var Room = castBackToObject(Datastore.Get(chatrooms_tbl, roomname));
        RemovePlayerFromChatRoom(Player, Room, CURRENT_PLAYER_LEFT_CHATROOM_BY_COMMAND);
    }
    else if(cmd == "joinroom") {
        var string = "";
        for(var str in args) {
            string += str + " ";
        }
        var myargs = Data.SplitQuoteStrings(string);
        if(myargs.Length != 2) {
            Player.Message("Useage: /joinroom \"name\" \"password\"");
            return;
        }
        if(!dataStoreContainsKey(chatrooms_tbl, Data.ToLower(myargs[0]))) {
            Player.Message("Chatroom: " + myargs[0] + " not found! Check your spelling again!");
            return;
        }
        if(dataStoreContainsKey(chatrooms_player_to_room_tbl, Player.SteamID)) { // Already in a chatroom
            if(!PLUGIN_ALLOW_JOIN_WITHOUT_LEAVING_FIRST) {
                Player.Message("You are already in a chatroom! Leave it first! /leaveroom");
                return;
            }
            var roomname = Datastore.Get(chatrooms_player_to_room_tbl, Player.SteamID);
            roomname = Data.ToLower(roomname);
            if(!dataStoreContainsKey(chatrooms_tbl, roomname)) {
                Datastore.Remove(chatrooms_player_to_room_tbl, Player.SteamID);
                Datastore.Save();
            }
            else {
                var Room = castBackToObject(Datastore.Get(chatrooms_tbl, roomname));
                RemovePlayerFromChatRoom(Player, Room, CURRENT_PLAYER_LEFT_CHATROOM_BY_COMMAND);
            }
        }
        var Room = castBackToObject(Datastore.Get(chatrooms_tbl, Data.ToLower(myargs[0])));
        AddPlayerToChatroom(Player, Room, myargs[1]);
    }
    else if(cmd == "publicrooms") {
        displayPublicChatroomsToPlayer(Player);
    }
    else if(cmd == "all") {
        var string = getstringofargs(args, 0, 0);
        Server.BroadcastFrom("[ALL - " + Player.Name + "]", string);
    }
}

function On_PlayerDisconnected(Player) {
    if(!dataStoreContainsKey(chatrooms_player_to_room_tbl, Player.SteamID)) return;
    var roomname = Datastore.Get(chatrooms_player_to_room_tbl, Player.SteamID);
    roomname = Data.ToLower(roomname);
    if(!dataStoreContainsKey(chatrooms_tbl, roomname)) {
        Datastore.Remove(chatrooms_player_to_room_tbl, Player.SteamID);
        Datastore.Save();
        return;
    }
    var Room = castBackToObject(Datastore.Get(chatrooms_tbl, roomname));
    RemovePlayerFromChatRoom(Player, Room, CURRENT_PLAYER_LEFT_CHATROOM_BY_DISCONNECT);
}

function On_ServerInit() {
        Datastore.Load();
}
function On_ServerShutdown() {
        Datastore.Flush(chatrooms_player_to_room_tbl);
        Datastore.Flush(chatrooms_tbl);
        Datastore.Flush(chatrooms_owner_tbl);
        Datastore.Save();
}


function CreateChatRoomForPlayer(Player, Room) {
    if(arrayContainsValue(PLUGIN_NOT_ALLOWED_ROOMNAMES, Room.Name)) {
        Player.Message("A chatroom with this name is not allowed. Choose another one!");
        return;
    }
    if(dataStoreContainsKey(chatrooms_tbl, Data.ToLower(Room.Name))) {
        Player.Message("A chatroom with this name already exists. Choose another one!");
        return;
    }
    if(dataStoreContainsKey(chatrooms_owner_tbl, Player.SteamID)) {
        Player.Message("You can't open a second chatroom. Remove your chatroom first! /removeroom");
        return;
    }
    var ostr = serializeObject(Room);
    Datastore.Add(chatrooms_tbl, Data.ToLower(Room.Name), ostr);
    Datastore.Add(chatrooms_owner_tbl, Room.Owner, ostr);
    Datastore.Save();
    Player.Message("Room: " + Room.Name + " created! (Password: " + Room.Password + " - MaxPlayers: " + Room.MaxPlayers + ")");
    Player.Message("Type /joinroom \"" + Room.Name + "\” \"" + Room.Password + "\" to join it!");
}

function RemovePlayerChatRoom(Player) {
    if(!dataStoreContainsKey(chatrooms_owner_tbl, Player.SteamID)) {
        Player.Message("You don't own a chatroom! Create one! /createroom \”name\" \"password\" maxplayers");
        return;
    }
    var Room = castBackToObject(Datastore.Get(chatrooms_owner_tbl, Player.SteamID));

    RemovePlayerFromChatRoom(Player, Room, CURRENT_PLAYER_REMOVED_CHATROOM);
    for(var MyPlayer in Server.Players) {
        RemovePlayerFromChatRoom(MyPlayer, Room, OTHER_PLAYER_REMOVED_CHATROOM);
    }
    Datastore.Remove(chatrooms_owner_tbl, Player.SteamID);
    Datastore.Remove(chatrooms_tbl, Data.ToLower(Room.Name));
    Datastore.Save();
}

function RemovePlayerFromChatRoom(Player, Room, reason) {
    if(!dataStoreContainsKey(chatrooms_tbl, Data.ToLower(Room.Name))) {
        Datastore.Remove(chatrooms_player_to_room_tbl, Player.SteamID);
        Datastore.Save();
        return;
    }
    if(!dataStoreContainsKey(chatrooms_player_to_room_tbl, Player.SteamID)) return;
    if(Datastore.Get(chatrooms_player_to_room_tbl, Player.SteamID) != Room.Name) return;


    if(reason == CURRENT_PLAYER_REMOVED_CHATROOM) {
        Player.Message("You removed your chatroom! You are back in the all-chat!");
    }
    else if(reason == OTHER_PLAYER_REMOVED_CHATROOM) {
        Player.Message("This chatroom has been removed! You are back in the all-chat!");
    }
    else if(reason == CURRENT_PLAYER_LEFT_CHATROOM_BY_COMMAND || reason == CURRENT_PLAYER_LEFT_CHATROOM_BY_DISCONNECT) {
        Room.Players = parseInt(Room.Players) - 1;
        Datastore.Add(chatrooms_tbl, Data.ToLower(Room.Name), serializeObject(Room));
        if(PLUGIN_DISPLAY_JOIN_LEAVE_MESSAGES) {
            var message = Player.Name + " left the chatroom!";
            sendChatroomMessage(null, Room, message);
        }
        if(reason == CURRENT_PLAYER_LEFT_CHATROOM_BY_COMMAND) {
            Player.Message("You left the chatroom. You are back in the all-chat!");
        }
        if(Room.Players == 0) {
            if(PLUGIN_REMOVE_EMPTY_ROOMS) Datastore.Remove(chatrooms_tbl, Data.ToLower(Room.Name));
        }
    }
    Datastore.Remove(chatrooms_player_to_room_tbl, Player.SteamID);
    Datastore.Save();
}

function AddPlayerToChatroom(Player, Room, password) {
    if(Room.Password != password) {
        Player.Message("Wrong password for Chatroom: " + Room.Name + "!");
        return;
    }
    Room.MaxPlayers = parseInt(Room.MaxPlayers);
    Room.Players = parseInt(Room.Players);
    if(Room.Players + 1 > Room.MaxPlayers) {
        Player.Message("Chatroom: " + Room.Name + " is full!");
        return;
    }
    Room.Players += 1;
    Datastore.Add(chatrooms_player_to_room_tbl, Player.SteamID, Room.Name);
    Player.Message("You joined the chatroom: " + Room.Name);
    if(PLUGIN_DISPLAY_JOIN_LEAVE_MESSAGES) {
        var message = Player.Name + " joined the chatroom!";
        sendChatroomMessage(null, Room, message);
    }
    Datastore.Add(chatrooms_tbl, Data.ToLower(Room.Name), serializeObject(Room));
    Datastore.Save();

}

function displayPublicChatroomsToPlayer(Player) {
    var counter = 0;
    for(var roomstr in Datastore.Values(chatrooms_tbl)) {
        var Room = castBackToObject(roomstr);
        if(Room.Password == "") {
            Player.Message("Chatroom: " + Room.Name);
            counter++;
        }
    }
    if(counter == 0) {
        Player.Message("No public chatrooms found!");
    }
}

function sendChatroomMessage(Player, Room, Message) {
    for(var MyPlayer in Server.Players) {
        if(!dataStoreContainsKey(chatrooms_player_to_room_tbl, MyPlayer.SteamID)) continue;
        if(Datastore.Get(chatrooms_player_to_room_tbl, MyPlayer.SteamID) != Room.Name) continue;
        if(MyPlayer.SteamID == Player.SteamID) continue;
        if(Player == null)     MyPlayer.MessageFrom("[" + Room.Name + "]", Message);
        else MyPlayer.MessageFrom("[" + Room.Name + "]", Player.Name + ":" + Message);
    }
}

function castBackToObject(serializedstring) {
        var MyObject = {};
        var s1 = serializedstring.split(",");
        for(var i = 0; i < s1.length; i++) {
                var s2 = s1[i].split("=");
                MyObject[s2[0]] = s2[1];
        }
        return MyObject;
}
function serializeObject(MyObject) {
        var string = "";
        for(var key in MyObject) {
                if(MyObject.hasOwnProperty(key)) {
                        string += key + "=" + MyObject[key] + ",";
                }
        }
        string = Data.Substring(string, 0 , Data.StrLen(string) -1);
        return string;
}

function dataStoreContainsKey(tbl, pkey) {
        for(var key in Datastore.Keys(tbl)) {
                if(Data.ToLower(key) == Data.ToLower(pkey)) return true;
        }
        return false;
}

function arrayContainsValue(array, value) {
    for(var i = 0; i < array.length; i++) {
        if(Data.ToLower(array[i]) == Data.ToLower(value)) {
            return true;
        }
    }
    return false;
}

function getstringofargs(args, start, followingargs){
    var string = "";
    for(var i = start; i < args.Length - followingargs; i++) {
        string += args[i] + " ";
    }
    string = Data.Substring(string, 0, Data.StrLen(string) - 1);
    return string;
}
 
Last edited:

Damian Knight

New Member
Member
Aug 14, 2014
9
0
1
New York
Removed the second one because looks like I fixed my code allllll on my own!!!! The one left isn't my code so idk it as well, its a project I am trying to revitalize...
 

mikec

Master Of All That I Survey
Retired Staff
Trusted Member
Jul 12, 2014
296
152
28
Los Angeles, California, USA
I strongly recommend that Magma and Jint2 plugins use var to declare functions in global - except for the Fougerite hooks and Fougerite Timer callbacks. The reason to do this is that a function declared in the global context with the function keyword will be invoked in a new instance of the Javascript engine. A function declared with var in the global context will instead be bound to the function or functions that call them when the plugin code is evaluated at PluginInit time. It will execute within the same instance of the Javascript engine as the function that calls it.

Obviously, it is a significant performance hit to instance a new Javascript engine every time your global functions are called, not to mention the needless waste of memory, allocated and discarded right after use, which will just make the garbage collector work that much harder.

JavaScript:
var CreateChatRoomForPlayer = function(Player, Room) {
// ...
}
var RemovePlayerChatRoom = function(Player) {
// ...
}
// and so on...
 

mikec

Master Of All That I Survey
Retired Staff
Trusted Member
Jul 12, 2014
296
152
28
Los Angeles, California, USA
Just to be clear, Fougerite hooks and Timer callbacks MUST be declared with the function keyword in global. The Plugin loader won't "see" them otherwise. Hooks are the ones that start with "On_" and Timer callbacks are the ones that end with "Callback", and that you pass the first part of the name to Plugin.CreateTimer.

Hope that's clear!