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
or game: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)