[Release] Lua Scripting
-
Just a question: I don't know how to program, but with this Lua script is it possible to make smart bots (since it's impossible to make with the current chaiscript) ?
Xedi yes
-
good job! finally see something good for mw3..
-
Rosamaha Still won't allow you to set blocked commands on clients
-
Xerxes good that gsc support comes soon ^^ sadly I stopped playing mw3 atm
-
good release
-
Xx_Phoenix_xX i think this is what you mean
game:onplayerdamage(function(_self, inflictor, attacker, damage, dflags, mod, weapon, point, dir, hitloc) if (game:isplayer(attacker) ~= 1 or _self.sessionteam == attacker.sessionteam or _self == attacker) then return end local huddamage = game:newclienthudelem(attacker) huddamage.alignx = "center" huddamage.horzalign = "center" huddamage.x = 10 huddamage.y = 235 huddamage.fontscale = 1.6 huddamage.font = "objective" huddamage:setvalue(damage) if (hitloc == "head") then huddamage.color = vector:new(1, 1, 0.25) end huddamage:moveovertime(1) huddamage:fadeovertime(1) huddamage.alpha = 0 huddamage.x = math.random(25, 70) huddamage.y = 235 + math.random(25, 70) * (math.random(0, 1) == 1 and -1 or 1) game:ontimeout(function() huddamage:destroy() end, 1000) end)
fed so how do i implement this on my game?
-
Put that in a file like
Plutonium/storage/iw5/scripts/yourscript/__init__.lua
-
fed does it work on all servers or only my own? btw nice gungame server its lots of fun
-
As many of you probably know the current chaiscript scripting is pretty bad and has many limitations. This plugin implements lua scripting in IW5 and fixes all those problems.
Everything is basically the same as in IW6x (documentation can be found here).
How
- Download the latest version from the Releases tab
- Copy it to
%localappdata%/Plutonium/storage/iw5/plugins/
- Create a
__init__.lua
file in a folder with a name of your choice in%localappdata%/Plutonium/storage/iw5/scripts/
- Example
%localappdata%/Plutonium/storage/iw5/scripts/myscript/__init__.lua
- Run the server (preferably with the
-no-scripting
flag to disable ChaiScript)
Below are some features that are not available or documented in IW6x
Chat notifies
level:onnotify("say", function(player, message) print(player.name .. " said: " .. message) end)
or
level:onnotify("connected", function(player) player:onnotify("say", function(message) print(player.name .. " said: " .. message) end) end)
Player damage/killed callbacks
Callbacks can be added using the
game:onplayerkilled
orgame:onplayerdamage
functions:Damage can be changed by returning it
Returning anything other than a number will not do anything (must be an integer)
game:onplayerdamage(function(_self, inflictor, attacker, damage, dflags, mod, weapon, point, dir, hitloc) damage = 0 return damage end)
game:onplayerkilled(function(_self, inflictor, attacker, damage, mod, weapon, dir, hitloc, timeoffset, deathanimduration) print(attacker.name .. " killed " .. _self.name) end)
Arrays
GSC arrays are supported and can be accessed similarly to gsc:
local ents = game:getentarray() for i = 1, #ents do print(ents[i]) end
To get the array's keys use the
getkeys
method:local keys = player.pers.getkeys() for i = 1, #keys do print(keys[i]) end
Structs
GSC structs are also supported similarly as the arrays.
To get an entity's struct use the
getstruct
method:local levelstruct = level:getstruct() levelstruct.inGracePeriod = 10000
Structs in other variables like arrays are automatically converted:
level:onnotify("connected", function(player) player:onnotify("spawned_player", function() player.pers.killstreaks[1].streakName = "ac130" player.pers.killstreaks[1].available = 1 end) end)
Note: you cannot create new struct fields but only modify or read existing ones, same thing for arrays
Functions
You can call (will not work for every function) functions and methods within the game's gsc scripts using the
scriptcall(filename, function, ...)
method:level:onnotify("connected", function(player) player:onnotify("spawned_player", function() local hudelem = player:scriptcall("maps/mp/gametypes/_hud_utils", "createFontString", 1) hudelem:scriptcall("maps/mp/gametypes/_hud_util", "setPoint", "CENTER", nil, 100, 100) hudelem.label = "&Hello world" end) end)
Functions in variables such as structs or arrays will be automatically converted to a lua function.
The first argument must always be the entity to call the function on (level, player...)
local levelstruct = level:getstruct() level:onnotify("connected", function(player) player:onnotify("spawned_player", function() levelstruct.killstreakFuncs["ac130"](player) end) end)
fed It doesn't seem to work for me. I did the Damage Counter Script you made in the above comments. But It never worked, I neither know how to run it. (if you have to run it manually) Any Help?
-
fed It doesn't seem to work for me. I did the Damage Counter Script you made in the above comments. But It never worked, I neither know how to run it. (if you have to run it manually) Any Help?
@ScottieC111
1 - Copy the plugin toPlutonium/storage/iw5/plugins/
2 - Create a file inPlutonium/storage/iw5/scripts/yourscript/__init__.lua
and copy the code into it
3 - Run the server -
Looks like a great addition, I'll install Pluto IW5 to try this out.
I didn't notice any issues or development plan on GitHub. Looking forward to contributing to it.
-
fed Thank you for adding the lua support. I've been trying to get
hasperk
andunsetperk
to work but it seem it crash the server upon loading the script every time.function onPlayerSpawned( player ) if(player:haspek("specialty_grenadepulldeath")) then print(player.name .. " is using marty") end end function onPlayerConnected( player ) local spawnListener = player:onnotify("spawned_player", function() onPlayerSpawned(player) end) end level:onnotify("connected", onPlayerConnected)
-
fed Thank you for adding the lua support. I've been trying to get
hasperk
andunsetperk
to work but it seem it crash the server upon loading the script every time.function onPlayerSpawned( player ) if(player:haspek("specialty_grenadepulldeath")) then print(player.name .. " is using marty") end end function onPlayerConnected( player ) local spawnListener = player:onnotify("spawned_player", function() onPlayerSpawned(player) end) end level:onnotify("connected", onPlayerConnected)
st0rm not sure why it crashes but doing this works fine:
function onPlayerSpawned( player ) game:ontimeout(function() if(player:hasperk("specialty_grenadepulldeath") == 1) then print(player.name .. " is using marty") end end, 0) end function onPlayerConnected( player ) local spawnListener = player:onnotify("spawned_player", function() onPlayerSpawned(player) end) end level:onnotify("connected", onPlayerConnected)
-
Thanks Fed. That work just fine. I learnt the hard way the mw3 sets death perks in a really dumb way where there is not way to unset them since they're based on death streaks.
-
As many of you probably know the current chaiscript scripting is pretty bad and has many limitations. This plugin implements lua scripting in IW5 and fixes all those problems.
Everything is basically the same as in IW6x (documentation can be found here).
How
- Download the latest version from the Releases tab
- Copy it to
%localappdata%/Plutonium/storage/iw5/plugins/
- Create a
__init__.lua
file in a folder with a name of your choice in%localappdata%/Plutonium/storage/iw5/scripts/
- Example
%localappdata%/Plutonium/storage/iw5/scripts/myscript/__init__.lua
- Run the server (preferably with the
-no-scripting
flag to disable ChaiScript)
Below are some features that are not available or documented in IW6x
Chat notifies
level:onnotify("say", function(player, message) print(player.name .. " said: " .. message) end)
or
level:onnotify("connected", function(player) player:onnotify("say", function(message) print(player.name .. " said: " .. message) end) end)
Player damage/killed callbacks
Callbacks can be added using the
game:onplayerkilled
orgame:onplayerdamage
functions:Damage can be changed by returning it
Returning anything other than a number will not do anything (must be an integer)
game:onplayerdamage(function(_self, inflictor, attacker, damage, dflags, mod, weapon, point, dir, hitloc) damage = 0 return damage end)
game:onplayerkilled(function(_self, inflictor, attacker, damage, mod, weapon, dir, hitloc, timeoffset, deathanimduration) print(attacker.name .. " killed " .. _self.name) end)
Arrays
GSC arrays are supported and can be accessed similarly to gsc:
local ents = game:getentarray() for i = 1, #ents do print(ents[i]) end
To get the array's keys use the
getkeys
method:local keys = player.pers.getkeys() for i = 1, #keys do print(keys[i]) end
Structs
GSC structs are also supported similarly as the arrays.
To get an entity's struct use the
getstruct
method:local levelstruct = level:getstruct() levelstruct.inGracePeriod = 10000
Structs in other variables like arrays are automatically converted:
level:onnotify("connected", function(player) player:onnotify("spawned_player", function() player.pers.killstreaks[1].streakName = "ac130" player.pers.killstreaks[1].available = 1 end) end)
Note: you cannot create new struct fields but only modify or read existing ones, same thing for arrays
Functions
You can call (will not work for every function) functions and methods within the game's gsc scripts using the
scriptcall(filename, function, ...)
method:level:onnotify("connected", function(player) player:onnotify("spawned_player", function() local hudelem = player:scriptcall("maps/mp/gametypes/_hud_utils", "createFontString", 1) hudelem:scriptcall("maps/mp/gametypes/_hud_util", "setPoint", "CENTER", nil, 100, 100) hudelem.label = "&Hello world" end) end)
Functions in variables such as structs or arrays will be automatically converted to a lua function.
The first argument must always be the entity to call the function on (level, player...)
local levelstruct = level:getstruct() level:onnotify("connected", function(player) player:onnotify("spawned_player", function() levelstruct.killstreakFuncs["ac130"](player) end) end)
fed I am trying to upload the plugin to the server, but I am getting the following error:
-
Thanks Fed. That work just fine. I learnt the hard way the mw3 sets death perks in a really dumb way where there is not way to unset them since they're based on death streaks.
st0rm And regarding this, I don't know what you want to achieve, but if it works for you, in GSC I use this to deactivate the death streaks
onPlayerKilled() { self endon("disconnect"); level endon("game_ended"); for(;;) { self waittill("killed_player"); self.pers["cur_death_streak"] = 0; //Stop deathstreak } }
-
I needed Net Framework 3.5. I already solved it.
-
As many of you probably know the current chaiscript scripting is pretty bad and has many limitations. This plugin implements lua scripting in IW5 and fixes all those problems.
Everything is basically the same as in IW6x (documentation can be found here).
How
- Download the latest version from the Releases tab
- Copy it to
%localappdata%/Plutonium/storage/iw5/plugins/
- Create a
__init__.lua
file in a folder with a name of your choice in%localappdata%/Plutonium/storage/iw5/scripts/
- Example
%localappdata%/Plutonium/storage/iw5/scripts/myscript/__init__.lua
- Run the server (preferably with the
-no-scripting
flag to disable ChaiScript)
Below are some features that are not available or documented in IW6x
Chat notifies
level:onnotify("say", function(player, message) print(player.name .. " said: " .. message) end)
or
level:onnotify("connected", function(player) player:onnotify("say", function(message) print(player.name .. " said: " .. message) end) end)
Player damage/killed callbacks
Callbacks can be added using the
game:onplayerkilled
orgame:onplayerdamage
functions:Damage can be changed by returning it
Returning anything other than a number will not do anything (must be an integer)
game:onplayerdamage(function(_self, inflictor, attacker, damage, dflags, mod, weapon, point, dir, hitloc) damage = 0 return damage end)
game:onplayerkilled(function(_self, inflictor, attacker, damage, mod, weapon, dir, hitloc, timeoffset, deathanimduration) print(attacker.name .. " killed " .. _self.name) end)
Arrays
GSC arrays are supported and can be accessed similarly to gsc:
local ents = game:getentarray() for i = 1, #ents do print(ents[i]) end
To get the array's keys use the
getkeys
method:local keys = player.pers.getkeys() for i = 1, #keys do print(keys[i]) end
Structs
GSC structs are also supported similarly as the arrays.
To get an entity's struct use the
getstruct
method:local levelstruct = level:getstruct() levelstruct.inGracePeriod = 10000
Structs in other variables like arrays are automatically converted:
level:onnotify("connected", function(player) player:onnotify("spawned_player", function() player.pers.killstreaks[1].streakName = "ac130" player.pers.killstreaks[1].available = 1 end) end)
Note: you cannot create new struct fields but only modify or read existing ones, same thing for arrays
Functions
You can call (will not work for every function) functions and methods within the game's gsc scripts using the
scriptcall(filename, function, ...)
method:level:onnotify("connected", function(player) player:onnotify("spawned_player", function() local hudelem = player:scriptcall("maps/mp/gametypes/_hud_utils", "createFontString", 1) hudelem:scriptcall("maps/mp/gametypes/_hud_util", "setPoint", "CENTER", nil, 100, 100) hudelem.label = "&Hello world" end) end)
Functions in variables such as structs or arrays will be automatically converted to a lua function.
The first argument must always be the entity to call the function on (level, player...)
local levelstruct = level:getstruct() level:onnotify("connected", function(player) player:onnotify("spawned_player", function() levelstruct.killstreakFuncs["ac130"](player) end) end)
fed I came here today to ask a question about the lua language in Bo2 Plutonium, I wanted to know another method to change or add custom menus in bo2 Plutonium without having to use the plutonium files that is privategamelobby_project.lua ?
I want to load my own lua script into the game, is that possible ? How to do that..?
-
Hi
I try to use the 1.8 version when i start the server it crashs without error
i use windows server 2019