person8880 / shine Goto Github PK
View Code? Open in Web Editor NEWAn administration mod for Natural Selection 2.
An administration mod for Natural Selection 2.
Stop votes being started when the map's going to change. Also change the colour of the next map text.
If we can't decode it into a table, then throw an error and halt loading.
3 issues
Thanks
Hook into the default ban system and redirect it to Shine.
Remove scramble and random, create a new central vote plugin. Have multiple modes of operation, from pure random, to previous rounds score based to NS2Stats ELO ranking.
When a player joins, query every server in the list of redirects for player counts. After 5 seconds, collate the data we have and try and send them to a server with a free slot.
If there is no data in time, then send them to the first redirect. If all servers are "full", then inform them and kick them.
Add the time remaining on the current map to the text in the top right of the screen when a next map vote is in progress. This should remove confusion where people think the map's going to change at the end of the round.
Instead of time based, have an option for a maximum number of rounds per map.
Apparently my change didn't work, so need to look into this in more detail.
The default NS2 is strictly if time on map > map cycle time then set it to cycle else keep going. This is dumb when there's only 1 minute left on the cycle for instance.
Need to override the NS2 map cycle to get it to change instead, add this to the map vote plugin.
Hi,
Thanks
Alc
There should be an option to allow CycleOnEmpty when there is still either 1 or X defined players on the server.
Once MvM updates to use hooks, need to check the content for conflicts.
Hello. I realise that I can't start a chat message with anything other than A-Z and 0-9. Important for smileys.
Great admin kit by the way. ๐
When in a game, if a losing team starts to concede or surrender the other team will be able to see it as well as any spectators watching. We came across this issue live on a stream so it was quite funny, but I think that would be something to look into =). Also, I don't know if it helps or not, but it appears to say that it needs 0 votes to concede for everyone but the team conceding. The team conceding on the other hand sees the votes normally.
Cheers
Automatically enables all talk whilst teams are waiting to get commanders. Once the countdown to begin starts, turn all talk off.
If one server's 'full', send them to another.
Allow for syncing ban lists over the web.
My AllTalk options are all disabled.
{
"AllTalk": false,
"EjectVotesNeeded": 0.5,
"AllTalkPreGame": false
}
However, the lower center of the screen displays "All talk is enabled".
I tried toggling the setting by using sh_AllTalk. The setting toggled on and off as expected but the "All talk is enabled" message would always persist.
If all talk before the game start is enabled, then have a small persistent bit of text before the game starts telling them. Make it red when the game goes into kGameState.PreGame saying it's disabled and fade it out on game start.
Some users have reported that the addon's functionality is not always complete. Need to test different configurations with the map cycle file and other things I suspect are causing problems to find the exact issue.
I would like to create an interface that allows admins to run commands through a centralised menu, and also use it to alter plugin settings etc.
If this were Garry's mod, I'd use Derma elements, need to find an equivalent in NS2 or create my own if not.
This will take a long while if I have to create them...
Eject them after a short time idle and notify the team.
Hey,
This isnt really a big issue at all but still putting it here since I don't know where else to do it.
I would love to have a feature where I can get every sh_ command in the console with a short description of its function, pretty much how sv_help works.
So you get a litle overview of what commands are available to you. If I do sv_help now, the sh_ commands do not get printed to the console.
Thanks for reading.
-Fly
i made plugin of your mod. i called shop.
i want to add button to that plugin.
can you add some code for me.
GUIShineVoteMenu.lua > ClickFuncs
SHOP = function()
return GenericClick( "sh_shop" )
end
CombatNS2Gamerules replaces NS2Gamerules:JoinTeam meaning we can't see or affect team joins.
After a try sh_status*
[Server] Script Error #1: lua/lib/player.lua:142: attempt to call global 'Floor' (a nil value)
Call stack:
#1: NS2ToSteamID lua/lib/player.lua:142
ID = 13542427
#2: Func lua/extensions/basecommands.lua:231
Client = ServerClient { }
CanSeeIPs = true
PlayerList = ClassEntityList { }
Size = 1
GameIDs = {userdata=1 }
SortTable = {1= {1=1, 2=ServerClient { } } }
Count = 2
(for index) = 1
(for limit) = 1
(for step) = 1
i = 1
Data = {1=1, 2=ServerClient { } }
GameID = 1
PlayerClient = ServerClient { }
Player = ReadyRoomPlayer-806 {activeWeaponId=-1, alive=true, animateAngles=false, animateDistance=false, animatePosition=false, animateYOffset=false, animationBlend=0.20000000298023, animationGraphIndex=41, animationGraphNode=12, animationSequence2=1, animationSequence=0, animationSpeed2=1, animationSpeed=1, animationStart2=556.091796875, animationStart=556.18981933594, armor=0, baseYaw=0, bodyYaw=0, bodyYawRun=0, cameraDistance=0, clientIndex=1, collisionRep=0, communicationStatus=1, countingDown=false, crouching=false, currentBadge=1, darwinMode=false, desiredCameraAngles=Vector {x=0, y=0, z=0 }, desiredCameraDistance=0, desiredCameraPosition=Vector {x=0, y=0, z=0 }, desiredCameraYOffset=0, flinchIntensity=0, followingTransition=false, fov=90, frozen=false, fullPrecisionOrigin=Vector {x=14.963448524475, y=166.55451965332, z=252.87007141113 }, gameEffectsFlags=0, gameStarted=false, giveDamageTime=0, gravityEnabled=true, health=100, healthIgnored=false, isMoveBlocked=false, isUsing=false, jumpHandled=false, jumping=false, layer1AnimationBlend=0, layer1AnimationGraphNode=137, layer1AnimationSequence2=-1, layer1AnimationSequence=-1, layer1AnimationSpeed2=1, layer1AnimationSpeed=1, layer1AnimationStart2=0, layer1AnimationStart=0, locationId=9, maxArmor=0, maxHealth=100, mode=1, modeTime=-1, modelIndex=63, moveButtonPressed=false, moveTransition=false, onGround=true, onGroundNeedsUpdate=true, onLadder=false, physicsGroup=7, physicsGroupFilterMask=0, physicsType=1, primaryAttackLastFrame=false, processMove=true, pushImpulse=Vector {x=0, y=0, z=0 }, pushTime=0, resetMouse=0, resources=0, runningBodyYaw=0.43642419576645, secondaryAttackLastFrame=false, sighted=false, slowAmount=0, standingBodyYaw=0.43642419576645, startCameraAngles=Vector {x=0, y=0, z=0 }, startCameraDistance=0, startCameraPosition=Vector {x=0, y=0, z=0 }, startCameraYOffset=0, stepAmount=-0.0015498305438086, stepStartTime=556.18981933594, syncHealth=false, teamNumber=0, teamResources=0, techId=35, timeLastHealed=0, timeLastMenu=0, timeOfCrouchChange=0, timeOfLastJump=555.39624023438, timeOfLastUse=0, timeOfLastWeaponSwitch=0, transitionDuration=0, transitionStart=0, tweeningFunction=1, upgrade1=1, upgrade2=1, upgrade3=1, upgrade4=1, upgrade5=1, upgrade6=1, velocity=Vector {x=0, y=0, z=0 }, velocityLength=0, velocityPitch=0, velocityYaw=0, viewModelId=3352, viewPitch=0.12099458277225, viewRoll=0, viewYaw=0.43642419576645, weaponsWeight=0 }
ID = 13542427
#3: lua/core/server/commands.lua:456
self = {AdminPrint=function, BuildChatMessage=function, BuildPluginData=function, BuildScreenMessage=function, CanTarget=function, ChatCommands= {acceptmotd= {Arguments= { }, ChatCmd="acceptmotd", ConCmd="sh_acceptmotd", Func=function, Help="Accepts the message of the day so you no longer see it on connect.", NoPerm=true }, alltalk= {Arguments= {1= {Default=function, Optional=true, Type="boolean" } }, ChatCmd="alltalk", ConCmd="sh_alltalk", Func=function, Help="<true/false> Enable or disable all talk, which allows everyone to hear each others voice chat regardless of team." }, autobalance= {Arguments= {1= {Error="Please specify whether auto balance should be enabled.", Type="boolean" }, 2= {Default=2, Min=1, Optional=true, Round=true, Type="number" }, 3= {Default=10, Min=0, Optional=true, Round=true, Type="number" } }, ChatCmd="autobalance", ConCmd="sh_autobalance", Func=function, Help="<true/false> Enables or disables auto balance. Player amount and seconds are optional." }, ban= {Arguments= {1= {NotSelf=true, Type="client" }, 2= {Default=60, Min=0, Optional=true, Round=true, Type="number" }, 3= {Default="No reason given.", Optional=true, TakeRestOfLine=true, Type="string" } }, ChatCmd="ban", ConCmd="sh_ban", Func=function, Help=" Bans the given player for the given time in minutes. 0 is a permanent ban." }, banid= {Arguments= {1= {Error="Please specify a Steam ID to ban.", Type="string" }, 2= {Default=60, Min=0, Optional=true, Round=true, Type="number" }, 3= {Default="No reason given.", Optional=true, TakeRestOfLine=true, Type="string" } }, ChatCmd="banid", ConCmd="sh_banid", Func=function, Help=" Bans the given Steam ID for the given time in minutes. 0 is a permanent ban." }, bring= {Arguments= {1= {NotSelf=true, Type="client" } }, ChatCmd="bring", ConCmd="sh_bring", Func=function, Help=" Moves the given player to your location." }, csay= {Arguments= {1= {Error="Please specify a message to send.", MaxLength=128, TakeRestOfLine=true, Type="string" } }, ChatCmd="csay", ConCmd="sh_csay", Func=function, Help="Displays a message in the centre of all play..., Commands= {sh_autobalance= {Arguments= {1= {Error="Please specify whether auto balance should be enabled.", Type="boolean" }, 2= {Default=2, Min=1, Optional=true, Round=true, Type="number" }, 3= {Default=10, Min=0, Optional=true, Round=true, Type="number" } }, ChatCmd="autobalance", ConCmd="sh_autobalance", Func=function, Help="<true/false> Enables or disables auto balance. Player amount and seconds are optional." }, sh_ban= {Arguments= {1= {NotSelf=true, Type="client" }, 2= {Default=60, Min=0, Optional=true, Round=true, Type="number" }, 3= {Default="No reason given.", Optional=true, TakeRestOfLine=true, Type="string" } }, ChatCmd="ban", ConCmd="sh_ban", Func=function, Help=" Bans the given player for the given time in minutes. 0 is a permanent ban." }, sh_banid= {Arguments= {1= {Error="Please specify a Steam ID to ban.", Type="string" }, 2= {Default=60, Min=0, Optional=true, Round=true, Type="number" }, 3= {Default="No reason given.", Optional=true, TakeRestOfLine=true, Type="string" } }, ChatCmd="banid", ConCmd="sh_banid", Func=function, Help=" Bans the given Steam ID for the given time in minutes. 0 is a permanent ban." }, sh_bring= {Arguments= {1= {NotSelf=true, Type="client" } }, ChatCmd="bring", ConCmd="sh_bring", Func=function, Help=" Moves the given player to your location." }, sh_changelevel= {Arguments= {1= {Error="Please specify a map to change to.", TakeRestOfLine=true, Type="string" } }, ChatCmd="map", ConCmd="sh_changelevel", Func=function, Help=" Changes the map to the given level immediately." }, sh_csay= {Arguments= {1= {Error="Please specify a message to send.", MaxLength=128, TakeRestOfLine=true, Type="string" } }, ChatCmd="csay", ConCmd="sh_csay", Func=function, Help="Displays a message in the centre of all player's screens." }, sh_darwin= {Arguments= {1= {Type="clients" }, 2= {Type="boolean" } }, ChatCmd= {1="god", 2="darwin" }, ConCmd="sh_darwin", Func=function, Help=" <true/false> En..., Config= {ActiveExtensions= {adverts=false, afkkick=false, badges=true, ban=true, basecommands=true, funcommands=true, logging=true, mapvote=true, motd=true, pregame=true, readyroom=true, serverswitch=false, unstuck=true, voterandom=true, votescramble=true, votesurrender=true, welcomemessages=true }, AddTag=true, ChatName="Admin", DateFormat="dd-mm-yyyy", EnableLogging=true, EqualsCanTarget=false, ExtensionDir="config://shine\plugins", GetUsersFromWeb=false, LogDir="config://shine\logs", RefreshInterval=60, RefreshUsers=false, SilentChatCommands=true, UsersURL="http://www.yoursite.com/users.json" }, ConvertData=function, GameIDs= {userdata=1 }, GenerateDefaultConfig=function, GenerateDefaultUsers=function, GetAllClients=function, GetAllPlayers=function, GetClient=function, GetClientByID=function, GetClientByNS2ID=function, GetClientByName=function, GetClientBySteamID=function, GetClientsByGroup=function, GetClientsForLog=function, GetDate=function, GetPermission=function, GetRandomPlayerList=function, GetTeamClients=function, GetTeamName=function, GetTimeString=function, GetUpValue=function, HasAccess=function, Hook= {Add=function, Call=function, Remove=function }, IsInGroup=function, LoadConfig=function, LoadExtension=function, LoadExtensionConfigs=function, LoadJSONFile=function, LoadUsers=function, LogString=function, NS2ToSteamID=function, Notify=function, NotifyColour=function, Plugins= {badges= {Cleanup=function, Enabled=true, Initialise=function, Version="1.0" }, ban= {AddBan=function, CheckBans=function, Cleanup=function, ClientConnect=function, Commands= {BanCommand= {Arguments= {1= {NotSelf=true, Type="client" }, 2= {Default=60, Min=0, Optional=true, Round=true, Type="number" }, 3= {Default="No reason given.", Optional=true, TakeRestOfLine=true, Type="string" } }, ChatCmd="ban", ConCmd="sh_ban", Func=function, Help=" Bans the given player for the given time in minutes. 0 is a permanent ban." }, BanIDCommand= {Arguments= {1= {Error="Please specify a Steam ID to ban.", Type="string" }, 2= {Default=60, Min=0, Optional=true, Round=true, Type="number" }, 3= {Default="No reason given.", Optional=true, TakeRestOfLine=true, Type="string" } }, ChatCmd="banid", ConCmd="sh_banid", Func=function, Help=" Bans the given Steam ID for the given time in minutes. 0 is a permanent ban." }, ListBansCommand= {Arguments= { }, ConCmd="sh_listbans", Func=function, Help="Lists all stored bans from Shine." }, UnbanCommand= {Arguments= {1= {Error="Please specify a Steam ID to unban.", Type="string" } }, ChatCmd="unban", ConCmd="sh_unban", Func=function, Help=" Unbans the given Steam ID." } }, Config= {Banned= {16418920= {Name="Nadjow", UnbanTime=0 }, 58897668= {Name="koj", UnbanTime=0 }, 709368= {Name="Pipette", UnbanTime=0 } }, BansURL="", DefaultBanTime=60, GetBansFromWeb=false }, ConfigName="Bans.json", ConvertData=function, CreateCommands=function, Enabled=true, GenerateDefaultConfig=function, HasConfig=true, Initialise=function, LoadConfig=function, RemoveBan=function, SaveConfig=function, SecondaryConfig="config://BannedPlayers.json", Version="1.3" }, basecommands= {CanPlayerHearPlayer=function, Cleanup=function, Commands= {AdminSayCommand= {Arguments= {1= {Error="Please specify a message.", MaxLength=80, TakeRestOfLine=true, Type="string" } }, ChatCmd="say", ConCmd="sh_say", Func=function, Help=" Sends a message to everyon..., Print=function, RegisterCommand=function, RegisterExtension=function, RemoveCommand=function, RemoveText=function, ReplaceClassMethod=function, RequestUsers=function, RunCommand=function, SaveConfig=function, SaveJSONFile=function, SaveLog=function, SaveUsers=function, SendPluginData=function, SendText=function, SendVoteOptions=function, SteamIDToNS2=function, Timer= {Create=function, Destroy=function, Exists=function, Simple=function }, UnloadExtension=function, UpdateText=function, UserData= {Groups= {admin_group= {Commands= { }, Immunity=10, IsBlacklist=true }, mod_group= {Commands= {1="sh_kick", 2="sh_say", 3="sh_randomall", 4="sh_rrall", 5="sh_eject", 6="sh_reset", 7="cyclemap", 8="sh_psay", 9="sh_tsay" }, Immunity=10, IsBlacklist=false } }, Users= {112750834= {Group="mod_group" }, 13542427= {Group="admin_group" }, 3954396= {Group="admin_group" }, 74148483= {Group="mod_group" } } } }
Client = ServerClient { }
ConCommand = "sh_status"
arg = nil
Command = {Arguments= { }, ConCmd="sh_status", Func=function, Help="Prints a list of all connected players and their relevant information.", NoPerm=true }
Player = ReadyRoomPlayer-806 {activeWeaponId=-1, alive=true, animateAngles=false, animateDistance=false, animatePosition=false, animateYOffset=false, animationBlend=0.20000000298023, animationGraphIndex=41, animationGraphNode=12, animationSequence2=1, animationSequence=0, animationSpeed2=1, animationSpeed=1, animationStart2=556.091796875, animationStart=556.18981933594, armor=0, baseYaw=0, bodyYaw=0, bodyYawRun=0, cameraDistance=0, clientIndex=1, collisionRep=0, communicationStatus=1, countingDown=false, crouching=false, currentBadge=1, darwinMode=false, desiredCameraAngles=Vector {x=0, y=0, z=0 }, desiredCameraDistance=0, desiredCameraPosition=Vector {x=0, y=0, z=0 }, desiredCameraYOffset=0, flinchIntensity=0, followingTransition=false, fov=90, frozen=false, fullPrecisionOrigin=Vector {x=14.963448524475, y=166.55451965332, z=252.87007141113 }, gameEffectsFlags=0, gameStarted=false, giveDamageTime=0, gravityEnabled=true, health=100, healthIgnored=false, isMoveBlocked=false, isUsing=false, jumpHandled=false, jumping=false, layer1AnimationBlend=0, layer1AnimationGraphNode=137, layer1AnimationSequence2=-1, layer1AnimationSequence=-1, layer1AnimationSpeed2=1, layer1AnimationSpeed=1, layer1AnimationStart2=0, layer1AnimationStart=0, locationId=9, maxArmor=0, maxHealth=100, mode=1, modeTime=-1, modelIndex=63, moveButtonPressed=false, moveTransition=false, onGround=true, onGroundNeedsUpdate=true, onLadder=false, physicsGroup=7, physicsGroupFilterMask=0, physicsType=1, primaryAttackLastFrame=false, processMove=true, pushImpulse=Vector {x=0, y=0, z=0 }, pushTime=0, resetMouse=0, resources=0, runningBodyYaw=0.43642419576645, secondaryAttackLastFrame=false, sighted=false, slowAmount=0, standingBodyYaw=0.43642419576645, startCameraAngles=Vector {x=0, y=0, z=0 }, startCameraDistance=0, startCameraPosition=Vector {x=0, y=0, z=0 }, startCameraYOffset=0, stepAmount=-0.0015498305438086, stepStartTime=556.18981933594, syncHealth=false, teamNumber=0, teamResources=0, techId=35, timeLastHealed=0, timeLastMenu=0, timeOfCrouchChange=0, timeOfLastJump=555.39624023438, timeOfLastUse=0, timeOfLastWeaponSwitch=0, transitionDuration=0, transitionStart=0, tweeningFunction=1, upgrade1=1, upgrade2=1, upgrade3=1, upgrade4=1, upgrade5=1, upgrade6=1, velocity=Vector {x=0, y=0, z=0 }, velocityLength=0, velocityPitch=0, velocityYaw=0, viewModelId=3352, viewPitch=0.12099458277225, viewRoll=0, viewYaw=0.43642419576645, weaponsWeight=0 }
Args = { }
ParsedArgs = { }
ExpectedArgs = { }
ExpectedCount = 0
Arguments = ""
#4: (tail call):-1
After a problem about not starting when both teams get a commander ... No error message on the console.
We launch "Sv_changemap ns2_summit" to load a other map and ...
Shine don't load during the loading map
I can send you the Log.txt with my hotmail [email protected]
Shinebaseconfig .txt
{
"LogDir": "config://shine\logs",
"DateFormat": "dd-mm-yyyy",
"AddTag": true,
"RefreshUsers": false,
"UsersURL": "http://www.yoursite.com/users.json",
"SilentChatCommands": true,
"ChatName": "Admin",
"EnableLogging": true,
"ExtensionDir": "config://shine\plugins",
"EqualsCanTarget": false,
"RefreshInterval": 60,
"ActiveExtensions": {
"funcommands": true,
"adverts": false,
"motd": true,
"serverswitch": false,
"welcomemessages": true,
"pregame": true,
"votescramble": true,
"voterandom": true,
"unstuck": true,
"readyroom": true,
"ban": true,
"votesurrender": true,
"badges": true,
"logging": true,
"basecommands": true,
"mapvote": true,
"afkkick": false
},
"GetUsersFromWeb": false
}
Some common ideas I see:
Also clean up the damn mess in the plugin!
I'm not sure if this is doable, but after seeing everything else in this mod, I wouldn't be surprised. Is it possible to make a pugbot system that works for 6v6 that chooses team captains and assigns people to teams etc? Something like this would be super cool.
If the game's just starting and a commander drops out, what could go wrong?
Replace with NotifyColour() for consistent, clearer messages.
I've started on this, but I'd like to get a good way to have plugins with a client side part to make plugins as self-contained as possible.
Noticing that today I'm having to disable Shine for the first time because I'm getting "Shine mod outdated" when trying to join. Is there some way to fix this? I never was sure how Shine mod updated itself on the server or if it did that automatically or what.
Hi,
Is it possible to load Shine via server.lua? The current situation with modded servers put me off loading any mods from the workshop :(
edit: How do I make this a question, not an issue?
Apparently NS2Stats has an ELO ranking system. Perhaps create a vote that uses it to 'balance' the teams better?
Also, extend the votemenu to have a button to show the player's stats?
Can you add a tournament mode like the one in ns2stats, because ns2stats is broken with each build, and we can't play matches for a few day.
For some reason the motd does not show up for anyone unless !motd is typed in chat.
motd is set to true under activeextensions and my motd config is as following:
{
"URL": "http://www.team-dpu.eu",
"Delay": 5,
"Mode": 2,
"MessageText": [ "Welcome to [NL]Team-dPu // Natural Selection 2!", "Join our community at Team-dPu.eu", "Have a pleasant stay!" ],
"Accepted": [ ]
}
Is there some setting i am missing or is this glitched atm?
Thanks in advance !
Hi,
Can anyone see a problem in my config file? The moderators and juniorfresh groups are not working with the badges, but the admin commands are. I can't see any difference between those groups and the others....
{
"Users": {
"143755": {
"Group": "admin_group"
},
"10060141": {
"Group": "troll"
},
"26949092": {
"Group": "moderators"
},
"3187207": {
"Group": "moderators"
},
"43701116": {
"Group": "juniorfresh"
},
"36389428": {
"Group": "ghost"
},
"12034125": {
"Group": "nyancat"
},
"4365505": {
"Group": "clover"
},
"73397263": {
"Group": "pumpkin"
},
"28998795": {
"Group": "troll"
},
"12844620": {
"Group": "pumpkin"
},
"17256747": {
"Group": "troll"
},
"38953806": {
"Group": "clover"
},
"7089528": {
"Group": "ghost"
}
},
"Groups": {
"admin_group": {
"IsBlacklist": true,
"Immunity": 50,
"Commands": [ "sh_randomimmune" ]
"badge": "admin"
},
"troll": {
"IsBlacklist": false,
"Immunity": 0,
"Commands": [ ]
"badge": "troll"
},
"unicorn": {
"IsBlacklist": false,
"Immunity": 0,
"Commands": [ ]
"badge": "unicorn"
},
"ghost": {
"IsBlacklist": false,
"Immunity": 0,
"Commands": [ ]
"badge": "ghost"
},
"nyancat": {
"IsBlacklist": false,
"Immunity": 0,
"Commands": [ ]
"badge": "nyancat"
},
"pumpkin": {
"IsBlacklist": false,
"Immunity": 0,
"Commands": [ ]
"badge": "pumpkin"
},
"clover": {
"IsBlacklist": false,
"Immunity": 0,
"Commands": [ ]
"badge": "clover"
},
"moderators": {
"IsBlacklist": true,
"Immunity": 20,
"Commands": [ "sh_randomimmune" ]
"badge": "admin"
},
"juniorfresh": {
"IsBlacklist": false,
"Immunity": 10,
"Commands": [ "sh_status", "sh_eject", "sh_say", "sh_kick", "sh_helplist", "sh_enablerandom" ]
"badge": "ghost"
}
}
}
I can't see a reason for them to be failing for a select few people.
We're passing old player data to the fallback sorting resulting in accessing entities that no longer exist as they've changed team. We need to recreate the TeamMembers and Targets tables before we fallback.
The current method is rushed and stupid.
Low priority
Could you implement a custom vote? Such as
sh_customvote "Should be ban xxx"
Which would run a custom vote of Yes or No answers and display the vote.
Just a fun thing really, so low priority as I say.
Should create a generic vote object and convert all voting plugins to use it.
Current method is not exactly great.
Current config handling is less than optimal. Have plugins simply define a default and handle the saving/loading/updating automatically.
Having real trouble on my server with shine, ns2stats and the badges mod installed. They just keep randomly dropping one, some or all mods. The mods just stop working completely.
Should they be compatible together? I have votemap, afk and unstuck switched off on ns2stats, so use the shine versions.
Just now, shine and badges was working, but not ns2stats. So I ran a steam update on the server, and when it restarted, only shine was working. So I restarted it again and now all 3 are working again. No config changes were made between doing all this.
Any ideas?
Add "csay" adverts, and add configurable colours to advert messages. The "csay" adverts should have configurable locations.
If the ELO mode fails too many times in a row, switch to the fallback mode. Maybe try again later, or just wait for the next map to try again?
I'll probably override NS2Stat's text function to move their text down rather than move the map vote text.
Add password support, and see if web admin polling works now.
Store data for last few rounds in a file, update it at the end of a round with the next set of data, average and use it for sorting.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.