Compare commits
3 Commits
work/onspa
...
main
Author | SHA1 | Date | |
---|---|---|---|
61c8823555 | |||
154ffe2fed | |||
dd0d995f3f |
29
addon.txt
29
addon.txt
@ -1,27 +1,32 @@
|
|||||||
Title: Custom Hostile NPCs to Citizen!
|
Title: Custom Hostile NPCs to Citizen
|
||||||
|
|
||||||
This is my first mod ever!
|
This is my first mod ever!
|
||||||
|
|
||||||
# About this Addon
|
[h2]About this Addon[/h2]
|
||||||
|
Tired of hearing your favorite character's enemy NPC sound like a combine? or buggy if using weapons rather than citizen NPCs?
|
||||||
|
|
||||||
This mod makes custom hostile NPC models change their behavior from Combine to Citizen.
|
This simple mod changes custom hostile NPC models change their behavior from combine to citizen by [b]overwriting the spawnmenu data[/b]. making hostile more human.
|
||||||
|
|
||||||
If you spawn NPCs from custom model addons as enemies or hostiles you realize that their behavior and their voices are combine soldiers. That's because most hostile NPCs from custom model addons use Combine as their base NPC.
|
If you spawn NPCs from custom model addons as enemies or hostiles you realize that their behavior and their voices are combine soldiers. That's because most hostile NPCs from custom model addons use combine as their base NPC.
|
||||||
|
|
||||||
Since the March 2025 update, gmod has added a new NPC called Enemy Rebel, which makes citizens hostile. This can be changed to custom NPCs that use Combine as their enemy.
|
Since the March 2025 update, gmod has added a new NPC called Enemy Rebel, which makes citizens hostile. This can be changed to custom NPCs that use Combine as their enemy.
|
||||||
|
|
||||||
If you want your enemies to be more human, this mod will change all hostile NPC custom models to behave like citizens.
|
[h2]Features[/h2]
|
||||||
|
[list]
|
||||||
|
[*] Change the behavior of custom models NPCs from combine to citizen
|
||||||
|
[*] Blacklist of NPCs who don't want to become citizens.
|
||||||
|
[/list]
|
||||||
|
|
||||||
# Features
|
To blacklist an NPC, right-click and copy the NPC in the spawn menu, go to Options > Replace Hostile Settings, paste the NPC class into the blacklist. to add multiple NPC, separate them with commas, example: npc_myhostile,npc_lenna,gfl2_lenna_enemy
|
||||||
- Change the behavior of custom models NPCs from combine to citizen
|
|
||||||
- Allows hostile to attack with melee weapons
|
|
||||||
|
|
||||||
I'll make VJ version if i can
|
You can reload blacklisted and non-blacklisted hostile NPCs with [b]replacehostile_reload[/b] or “Reload NPCs” button in settings
|
||||||
|
|
||||||
---
|
I'll make VJ version if i can. i'm still learning...
|
||||||
|
|
||||||
|
-----------
|
||||||
|
|
||||||
models used:
|
models used:
|
||||||
- Lenna https://steamcommunity.com/sharedfiles/filedetails/?id=3167885628
|
- [url=https://steamcommunity.com/sharedfiles/filedetails/?id=3167885628]Lenna[/url]
|
||||||
- Tomoko https://steamcommunity.com/sharedfiles/filedetails/?id=3133369749
|
- [url=https://steamcommunity.com/sharedfiles/filedetails/?id=3133369749]Tomoko[/url]
|
||||||
|
|
||||||
Note: i couldn't find a mod similar to the one i made, so i don't know who made it first.
|
Note: i couldn't find a mod similar to the one i made, so i don't know who made it first.
|
@ -1,61 +1,90 @@
|
|||||||
local npcs = list.Get("NPC")
|
local function loadBlacklistFile()
|
||||||
local citizenEnemy = npcs["npc_citizen_rebel_enemy"]
|
local json = file.Read("npc_blacklist.json", "DATA")
|
||||||
local originalListSet = list.Set
|
if not json or json == "" then return {} end
|
||||||
|
local data = util.JSONToTable(json)
|
||||||
function list.Set(listType, class, npc)
|
return istable(data) and data or {}
|
||||||
if listType == "NPC" then
|
|
||||||
if npc["Class"] == "npc_combine_s" and npc["Category"] ~= "#spawnmenu.category.combine" then
|
|
||||||
if !npc["KeyValues"] then
|
|
||||||
npc["KeyValues"] = {}
|
|
||||||
end
|
|
||||||
npc["KeyValues"]["SquadName"] = "m_EnemyRebel"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
originalListSet(listType, class, npc)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
hook.Add("OnEntityCreated", "ForceReplaceCombine", function(ent)
|
local function resetHostile()
|
||||||
timer.Simple(0, function()
|
local npcs = list.Get("NPC")
|
||||||
if !SERVER then return end
|
for class, npc in pairs(npcs) do
|
||||||
if not IsValid(ent) then return end
|
if npc["m_OldData"] then
|
||||||
|
local oldData = util.JSONToTable(npc["m_OldData"])
|
||||||
if ent:GetClass() == "npc_citizen" then
|
if oldData then
|
||||||
|
list.Set("NPC", class, oldData)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if ent:GetKeyValues()["squadname"] == "m_EnemyRebel" then
|
local function replaceHostile()
|
||||||
local pos = ent:GetPos()
|
local blacklist = loadBlacklistFile()
|
||||||
local ang = ent:GetAngles()
|
local npcs = list.Get("NPC")
|
||||||
local mdl = ent:GetModel()
|
local citizenEnemy = npcs["npc_citizen_rebel_enemy"]
|
||||||
local weps = ent:GetWeapons()
|
|
||||||
local health = ent:GetMaxHealth()
|
|
||||||
local keyValues = ent:GetKeyValues()
|
|
||||||
|
|
||||||
ent:Remove()
|
for class, npc in pairs(npcs) do
|
||||||
|
if table.HasValue(blacklist, class) then continue end
|
||||||
local npc = ents.Create("npc_citizen")
|
if npc["Class"] == "npc_combine_s" and npc["Category"] ~= "#spawnmenu.category.combine" then
|
||||||
if not IsValid(npc) then return end
|
npc["m_OldData"] = npc["m_OldData"] or util.TableToJSON(npc, false)
|
||||||
|
npc["Class"] = citizenEnemy["Class"]
|
||||||
for key, value in pairs(keyValues) do
|
npc["KeyValues"] = {
|
||||||
npc:SetKeyValue(key, tostring(value))
|
Hostile = 1,
|
||||||
-- if value ~= "" then
|
SquadName = "overwatch",
|
||||||
-- end
|
citizentype = 4
|
||||||
end
|
}
|
||||||
|
list.Set("NPC", class, npc)
|
||||||
npc:SetHealth(health)
|
end
|
||||||
npc:SetMaxHealth(health)
|
end
|
||||||
|
end
|
||||||
|
|
||||||
npc:SetKeyValue("hostile", 1)
|
CreateClientConVar("replacehostile_blacklist", "", false, false, "Blacklist NPC Classes")
|
||||||
npc:SetKeyValue("squadname", "overwatch")
|
|
||||||
npc:SetKeyValue("citizentype", 4)
|
|
||||||
|
|
||||||
for _, wep in ipairs(weps) do
|
concommand.Add("replacehostile_reload", function()
|
||||||
npc:Give(wep:GetClass())
|
resetHostile()
|
||||||
|
replaceHostile()
|
||||||
|
print("NPC Hostile Reloaded")
|
||||||
|
end)
|
||||||
|
|
||||||
|
hook.Add("PopulateToolMenu", "ReplaceHostileMenu", function()
|
||||||
|
local blacklist = loadBlacklistFile()
|
||||||
|
local defaultBlacklistStr = table.concat(blacklist, ",")
|
||||||
|
|
||||||
|
RunConsoleCommand("replacehostile_blacklist", defaultBlacklistStr)
|
||||||
|
|
||||||
|
spawnmenu.AddToolMenuOption("Options", "Replace Hostile", "ReplaceHostileConfig", "Settings", "", "", function(panel)
|
||||||
|
panel:ClearControls()
|
||||||
|
|
||||||
|
local blacklistEntry = panel:TextEntry("Blacklist Classes", "replacehostile_blacklist")
|
||||||
|
|
||||||
|
panel:ControlHelp("Separate classes with commas.\nExample: npc_my_custom_hostile,npc_my_hostile,npc_hostile_test")
|
||||||
|
panel:Button("Reload NPCs", "replacehostile_reload")
|
||||||
|
|
||||||
|
blacklistEntry.OnChange = function(self)
|
||||||
|
local val = self:GetValue() or ""
|
||||||
|
local newBlacklist = {}
|
||||||
|
|
||||||
|
for e in string.gmatch(val, '([^,]+)') do
|
||||||
|
local trimmed = string.Trim(e)
|
||||||
|
if trimmed ~= "" then
|
||||||
|
table.insert(newBlacklist, trimmed)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
npc:SetPos(pos)
|
local valid = true
|
||||||
npc:SetAngles(ang)
|
for _, v in ipairs(newBlacklist) do
|
||||||
npc:SetModel(mdl)
|
if type(v) ~= "string" or v == "" then
|
||||||
npc:Spawn()
|
valid = false
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if valid then
|
||||||
|
file.Write("npc_blacklist.json", util.TableToJSON(newBlacklist, false))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
end)
|
||||||
|
|
||||||
|
timer.Simple(0, function()
|
||||||
|
replaceHostile()
|
||||||
end)
|
end)
|
BIN
pics/pic_2.jpg
Normal file
BIN
pics/pic_2.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 194 KiB |
Loading…
x
Reference in New Issue
Block a user