Welcome to Open Carnage

A resource for Halo Custom Edition and MCC modding, with unique means of rewarding content creation and support. Have a wander to see why we're worth the time! - EST. 2012


  • Content count

  • Joined

  • Last visited

  • Raffle Tickets


About mouseboyx

Extra Information

  • Gender
  • Location
    Kansas, USA
  • Occupation
  • Interests
    Guitar, Halo, Programming

Contact Methods

Computer Details

  • Central Processor
    i5 6600k
  • Graphics
    RX 590
  • Memory
  • Storage
    2x500gb sata ssd
  • Display
    144hz 1080p 16:9
  • Operating System
    Ubuntu 20.04 + Windows 7
  1. I always wanted a complete list of those names, I do have something in mind to do with them, but it pertains to cheaters who join with those names. When someone nefarious joins with one of those names it's hard to counter their activities based on that name. Like doing a name ban or other things becomes impossible. Another idea using this list is to make an anonymous server where if someone doesn't join with one of these names, then they are kicked before they join. I've taken your list and put in in the format of a lua table of strings for convenience of script writers. {"New001","Donut","Penguin","Stumpy","Whicker","Shadow","Howard","Wilshire","Darling","Disco","Jack","The Bear","Sneak","The Big L","Whisp","Wheezy","Crazy","Goat","Pirate","Hambone","Butcher","Walla Walla","Snake","Caboose","Sleepy","Killer","Stompy","Mopey","Dopey","Weasel","Dasher","Grumpy","Hollywood","Tooth","Ghost","Noodle","King","Cupid","Prancer","Nuevo001","Saucy"}
  2. Great solution to fixing the map skip is disabled message, I wouldn't have thought to do that. My background is in web development so I'm kind of excited yet under-prepared to work on sapp lua scripts, but I'm learning more all the time though so that's a plus. I had somewhat vaguely remembered that sapp would tell someone if they had already skipped, but it slipped my mind, thanks for updating the script to a more complete version
  3. This script is intended for use on public servers. It is best used within a group of players that have trust among each other. The script is triggered by a slash command from halo chat like /register <password> or /unregister <password>. The password is configured in the script, and is the same for anyone who registers. For added security the command names "unregister" and "register" can both be changed in the script configuration. If you run a public server and have a group of people you know that often visit, then you can give that group this method of registration. If someone were to join with their name without it seeing their registered IP address the server would announce that they are a possible imposter. They would be automatically kicked within a configured time (20 seconds by default). The time limit is set to allow players with dynamic IP addresses to re-register their new IP. Which some may not want to register to begin with because it will become a hassle. Anonymous players that join will be unaffected as long as they do not attempt to impersonate someone who has registered. To them this script will be more or less invisible other than the messages it sends to all players. A name can be registered to as many IP addresses as necessary. When someone unregisters their name, all IP addresses associated with it are cleared from the match list. This script is only as strong as the people in the group who use it. If you intend to use this then keep in mind that the password may leak to parties that you do not wish to have it. The configuration section of the script is commented to give an idea of what each option does. This has been an issue believe it or not where an anonymous player joining as someone else and acting and chatting similar to what the real person would do. This does not ensure that will never happen due to the human element of using a password, but it's a good countermeasure against that type of trolling. This is basically a dynamic block / allow list based on IP address controlled from a slash command and password from within halo Use /register <password> to register your name to your IP Use /unregister <password> to no longer keep track of your name Both /register and /unregister can be changed to different command names to add extra security This may not be worth the effort for some, but if it's a legitimate problem then this script works as a solution, even if it can be a hassle. There may be some bugs, it would be cool if you posted them here so I can fix them when / if they do happen. Also I probably or maybe missed something important in the code, but it's my first release on OC FTW. Also I welcome improvement upon this or new ideas or angles on mitigating this type of problem. I'm probably just lazy so this is the best I could come up with for now. clan_register.lua
  4. Is there something special I need to do before releasing a script? I am looking for someone to audit or test this script that I would like to release, if that's appropriate. I've done extensive testing on 2 or more servers, but recently redid this script to make it lighter and more universal. It's a clan registration sapp script that gives a good chance at detecting players who are impersonating other players within your circle of influence. It works by specifying a custom command in the config like /register, but could be anything. Then a password is specified like "12345". If someone were to run with that config then they could register their name to the ip address by using /register 12345 from within halo. It is basically on the honor system by who you choose to give the /command <password> to. And if that leaks out due to human error the system collapses. If someone joins with a name already registered and the ip doesn't match it will kick them within a time frame (to allow for dynamic ip players to re-register). If someone's ip is always changing though it's probably best not to have them use this at all, unless they want to go through the hassle of typing /command <password> every time they join a server with this script. I don't have a graceful solution to un-register someone though, it has to be done by manually editing the file stored with the user / ip information. My clan/group on retail has had a problem with impersonators for a long time so this is my solution to attempting to fix that problem, but the password has leaked a few times, so this is a countermeasure with consequences if it's not used correctly. I also have no idea whether this is actually useful, or if it would become not worth what it offers due to the drawbacks. I used quite a bit of code from Chalwk's github to make this, so thanks to him for making it easier. This is the first proper script that I wrote for sapp, born out of necessity. clan_register.lua
  5. Yes, I'm sure it would be possible to write a script to make an improved map skip with a delay. Figuring out a good delay would be crucial, although something like 5-15 seconds would probably be plenty. That's an interesting insight into how map skipping is handled by sapp. I've not seen anything like this, I only recently started a server with both voting and skipping. But I have used skipping with a fixed mapcycle before. Sorry that I can't help with sapp's map skip feature or know enough about it, but I can offer this script outline: Detect whether the exact string "skip" was said by any player using register_callback(cb["EVENT_CHAT"], "OnServerChat") Announce to all that XYZPlayer has voted to skip the map, and set the index of an array using their player index so that their skip count can't be counted more than once. Also in the same message tell all players X more votes required to skip to mimic the sapp map skip behavior. Keep a count of the players currently in the server, and keep a count of which ones have said "skip" When a player quits remove their vote from the skip count, and reset the array detecting whether that PlayerIndex can perform a skip vote and remove their count from total players Divide those who wish to skip / current total players Have a configuration variable for the percentage of skips required to initiate a skip Multiply the ratio of skips/total by 100 to find the percentage. If the game has been running for more than 5-15 seconds then honor whether the map should be skipped, and run: execute_command("sv_map_next") Set the time running by seeing if a new game has started using register_callback(cb['EVENT_GAME_START'],"OnNewGame") Then use onTick() to count (incremented tick counter variable/30) Either 30 or or the tick rate. Also when the game starts clear out all the arrays and variables that are being used to keep track of everything like the array of players who can perform a skip and number of skip counts etc... You could set another configuration variable to set the number of seconds the game has to have been running to honor a skip Alternatively you could make it so nothing actually worked or was kept track of until that time limit was up, and say to the player that they need to wait X seconds before skipping. Or even have a configuration option at the top of the script to set that alternative behavior. I may be missing something but that's my thoughts on how it could work. Edit: Alright, I've got a proof of concept, I did some minor testing and the main bug is that when you disable the built in map skipping in sapp and instead use this script then sapp will tell the player that map skipping is disabled, even though it still technically works. Use this at your own risk! I can't guarantee that this will always work, but it did work for the minimal testing that I did with it. Edit 2: I forgot a break statement in the script causing it to report the wrong number of votes required for a skip to initiate delay_skip.lua
  6. Sorry if this doesn't solve the problem because it uses a script rather than events. But this will work to prevent an object from spawning. It was modified from HRshaft's object spawn replacement script. api_version = "" game_started = false mode="" map="" gameType="" function OnScriptLoad() register_callback(cb['EVENT_GAME_START'],"OnNewGame") register_callback(cb['EVENT_GAME_END'],"OnGameEnd") register_callback(cb['EVENT_OBJECT_SPAWN'],"OnObjectSpawn") end function OnScriptUnload() end function OnNewGame() game_started = true mode=get_var(1,"$mode"); map=get_var(1,"$map"); gameType=get_var(1,"$gt"); end function OnGameEnd() game_started = false mode="" map="" gameType="" end -- note: calls to this function must provide both arguments of obj_type & obj_name separated by comma function get_tag_info(obj_type, obj_name) local tag_id = lookup_tag(obj_type, obj_name) return tag_id ~= 0 and read_dword(tag_id + 0xC) or nil end function OnObjectSpawn(PlayerIndex, MapID, ParentID, ObjectID) if game_started then --this is an example to disable and prevent the sniper rifle from spawning if the game mode is pistols and the map is bloodgulch and the game type is ctf --set the mode, map, and gametype where it should apply if (gameType=="ctf") then if (mode=="pistols") then if (map=="bloodgulch") then --provide the object type and tag path to get_tag_info (\ must be replaced with \\) if MapID == get_tag_info("weap", "weapons\\sniper rifle\\sniper rifle") then --return false means the object will be prevented from spawning return false end end end end --apply to only bloodgulch regardless of anything else --[[if (map=="bloodgulch") then --provide the object type and tag path to get_tag_info (\ must be replaced with \\) if MapID == get_tag_info("weap", "weapons\\sniper rifle\\sniper rifle") then --return false means the object will be prevented from spawning return false end end]]-- --apply only to ctf --[[if (gameType=="ctf") then --provide the object type and tag path to get_tag_info (\ must be replaced with \\) if MapID == get_tag_info("weap", "weapons\\sniper rifle\\sniper rifle") then --return false means the object will be prevented from spawning return false end end]]-- --apply only to a game type called my_game_123 --[[ if (mode=="my_game_123") then --provide the object type and tag path to get_tag_info (\ must be replaced with \\) if MapID == get_tag_info("weap", "weapons\\sniper rifle\\sniper rifle") then --return false means the object will be prevented from spawning return false end end ]]-- -- you can nest if statements to apply to any one or multiple conditions like these return game_started end end
  7. This is what I'm running locally on Ubuntu Linux, but I'm running the same Ubuntu, Wine, and SAPP version on the vps where I host. It might not be the exact same kernel though it is 20.04 Ubuntu with the same 5.0 wine package, either way it works.
  8. I was having issues with halo names with special characters for the web stats. I've used these two lua functions, I can't remember where I found them, probably stackoverflow. function encodeChar(chr) return string.format("%%%X",string.byte(chr)) end function encodeString(str) local output, t = string.gsub(str,"[^%w]",encodeChar) return output end It works without a hitch when encoding something to be used in a query string like "http://mouseboyx.xyz/halo-stats/halo.php?exampleName="..encodeString(nameWithSpecialChars) Discordia is already doing a url encode for making an http get request, but I was looking at the discordia dependencies and how it makes http post requests to send messages to discord. I couldn't find whether it was actually url encoding post data that is sent out, so it may be worth checking out. It definitely is doing a json encode though, that I know for sure. If discordia already is url encoding post requests then using this function might be even worse because it will be double encoded and might produce some strange effects. Edit: Nevermind disregard this post I thought that the post request was being sent as "application/x-www-form-urlencoded" but it's being sent as "Content-Type: application/json" which work differently.
  9. Sorry I didn't know how the image uploading works, this is what it's supposed to be.
  10. Sadly I don't have many new in box keyboards that I can recommend, something like this https://www.ebay.com/itm/NEW-Genuine-HP-PS-2-Computer-Keyboard-And-Optical-Mouse/184544766168?hash=item2af7b9a8d8:g:xncAAOSwF2tft~ML It seems like it's good on the surface, but I've had a bad experience with this type of keyboard. After a while if you are pressing edges of keys rather than directly in the center it starts to degrade and create a lot of friction. I swapped it out and could type probably twice as fast, dumb me for not noticing how bad that keyboard was. I've tried others that have this same problem, I think I should be able to press the key on the very corner and it should work as well as in the center, so I'm probably biased. Most of the lower end Logitech keyboards have this problem, being able try before you buy helps a lot there. This is the exact keyboard I'm using https://www.ebay.com/itm/HP-Model-5187-7583-Keyboard-Gray-Silver-Multimedia-with-Media-Player-Controls/313151204409?epid=1162829008 but this one looks like the non skid rubber pads have fallen off, or some kid peeled them off. Other than the tactile input of the keys I care about having volume control and muting and the layout to remain the same.
  11. The first PC that my dad bought for me when I was in elementary school had the same keyboard as the one on the right, I had since lost it and found an ebay auction to buy one new. It's even older like from the 1990's because the windows key has the pre windows xp logo. I like it though it's a bit of nostalgia to add to my collection, besides the spacebar not registering if you hold down a and s or s and d at the same time. The keyboard for the main desktop is an HP probably from the xp-vista era but I got it at a garage sale and it's super dependable.
  12. I thought this to be the case until recently I found this post. I'm running 10.2.1 on wine 5.0, you also need to run it with a 32 bit wine prefix. I was disappointed for a long time until I ran this workaround, I was doing something crazy like running windows 7 in virtual box from an ubuntu host to run a halo server with sapp to do my development.
  13. This has to have benefits from what I can tell, people using search engines to look for solutions to problems are almost guaranteed to come here to look for an answer. While they may not make an account they're getting great advice. The spiders are indexing things based on specific information, so a very specific problem is likely to already have been posted here and solved. Particularly whenever I would search "sapp halo scripts" on google this site would come up in the top 3 results.
  14. So these may be underlying causes or belonging to an equally important group of root causes for these problems to exist in the first place. It's interesting where this led to, but I'm also trying to think about what it would take to fix some of these issues. Obviously the halo modding and retail communities still exist, and it's up to players and everyone to whether it continues. And from reading some of these posts it looks like halo was dealt a crap hand to begin with. I think the way that a halo server acts as a mediator and doesn't trust the clients to give the information themselves is a big help. There no name games out there, one I played once was Combat Arms (an FPS counter strike knock off). Through client modding you could do something like teleport all opponent players to a set location far outside the map and headshot them instantly with a set of hacks or cheats. I believe a halo server would not trust a client to do that in the first place. Back before no-lead existed I thought that the lead system was actually a sort of fair way to go about doing things, obviously not when you have high ping though, but you could adapt to having high ping. I never played halo on dial up and usually had between 33-166 ping from the beginning, but would occasionally go to servers hosted very far away to experience 266 or 300. It felt like a handicap but was probably fun because I knew I didn't always have to play that ping. Well, I didn't know what to expect when making this post, but some of the problems seemingly have no solution. Catching cheaters in particular, and keeping them away permanently, seems difficult. If you block all VPN connections there will be legitimate players who play on VPN's. If you /ipban a particular cheater then they can hop on a vpn and be back in a few seconds, there is not to my knowledge a registration system for public halo servers for people to register. Then anyone can join with anyone else's name and pretend to be that person. I've seen scripts that can allow a name only if it connects with a certain hash though, or else it's an automatic kick. For the clan I'm in, I cobbled together a script that allows all members to have a secret /command <password> to register their name to their IP address. Then if someone else joins with that name and doesn't have that IP it gives them 15 seconds to re-register or else it kicks them (set up so dynamic IP's will be taken into account). It would be interesting to see some sort of global registration that could be implemented to get a better handle on banning cheaters without much need to do self or group moderation of the servers that you own and operate. I don't know how particularly to do that but I have ideas, hashes worked well in the old days, but do not now. If there were some new hash type system where your client needed an addon to play on a global registered server, that might work, but still that's only an idea and there could be better ones out there. Then there's the problem of how those "new" hashes are generated and who can get a new one and what restrictions are placed on them, it might boil down to getting pii from people which seems like more of a hassle than the current methods for dealing with cheaters. Also the problem of organizing those hashes by how many offences they have on their record and what to do with that information, like a legit player getting banned a few times for playing against admins who can't recognize cheats vs skill or something. All hypothetical though and I'm sure I've left out something or overlooked something, these are things that would be nice if they existed. Thanks for continuing discussion and giving history and ideas. It kind of all boils down to being individually responsible for what you put out there, whether it be cheating on a halo server, or cheating on your taxes.
  15. I was doing a bit of reading, and I forgot that some http api use other http methods like PATCH, or PUT. I know that from the command line cURL can use the -X option to specify any http method and it would be excellent to have that type of functionality from within sapp. I'm assuming it would be easier to include an option or variable for specifying http method rather than creating functions for each specific one, but I may be wrong about that. In any case it would make it a more useful tool.