mouseboyx

Member
  • Content count

    74
  • Joined

  • Last visited

  • Raffle Tickets

    0

Everything posted by mouseboyx

  1. There are things that might be viewed as cheating, probably playing on public servers it's not that big of a deal, but if you were playing in a tournament it would be viewed as client modding or cheating. But these are in a gray area to me of whether or not they are cheating. These are from the point of view of a map that doesn't have these features by default, but if the map were made to have these features then it's all fine. Removing Camera Shake -- If a map uses camera shake on weapons (most prominent when firing a rocket launcher) is it cheating to remove all camera shake? With a weapon like the pistol I've done this before in my early days when I was 16-17 before I realized that it's somewhat dishonest to remove it. I did feel like I could get better aim and accuracy when removing it, and soon reverted the changes because I felt like I was cheating. Is it even possible to detect whether a client does this from server side? Changing the FOV -- Could be changed to give yourself either narrowed or widened peripheral vision. Once again I think this is fine on public servers, but it could be changed to something ridiculous to give 180 degree vision. Changing Textures/Light/Shaders -- Something like giving a hog a paint job or rims on a map that doesn't have that by default is a benign example, but making frag grenades more visible by turning them green or pink falls in a questionable area. Of course making walls transparent would give relatively the same cheat as a wall hack. Turning off Particles -- Since this is an option in the video settings and it has pros and cons I don't think this could be considered cheating unless it was established beforehand that it was against the rules. If particles were changed to be still visible yet lessened or semi-transparent through mods or map tools I think that would fall under something sinister because it wouldn't be readily available to everyone. These are obvious cheats where there is no question that it is cheating: Wall Hack -- Various methods probably exist, the basic idea is that it brings the z index of all players to be in front of everything else and highlights them with a color. Aim Bot -- Using a tool to gain perfect aim for head shots without ever needing to aim much yourself. Auto Shot -- I'm less familiar with this but I believe it is used in combination with an aim bot or wall hack to fire a weapon automatically if someone is within range and is in line of sight within the reticle. Lag or Speed Hack -- Using a speed hack program to simulate a client/server mismatch causing a warp, or purposely installing a lag switch, or introducing drops in a connection through software to warp. But this could be easily mistaken for a bad connection to the server. If someone lags every time when they take cover from fire and never lags at any other point it could be relatively save to assume they are using a lag switch of some kind. HAC2 -- Using Halo Anti Cheat for the purpose of screen watching instead of sight jacking. For example sight jacking someone to find their location rather than using it to spectate looking for aimbot, wallhack, or other cheats of a player. (I don't know if this is gray area, but it sure does seem dishonest to me) I'm interested to know what the opinions are on the "gray area" or other things that could be added to the list. Sorry if this post is not allowed, but the problem of cheaters on CE and Retail is a persistent one and it's good to have information out there. Edit: Sorry this probably doesn't belong here it might be more suitable to be put in off-topic or somewhere else.
  2. Replace starting weapons with different weapons. The script must be made aware of what the actual starting weapons for the mode/map are in order for it to work. The script comes with an example of replacing generic starting equipment with sniper and rocket. It can also swap weapon slots by replacement, for example generic equipment is assault rifle as primary and pistol as secondary, you can set the replacements so that the pistol is primary and assault rifle is secondary. You can dynamically load this script or multiple different versions in the events.txt based on custom modes: event_start $mode:custom_mode_123 'lua_load "replace_starting_equipment"' event_end $mode:custom_mode_123 'lua_unload "replace_starting_equipment"' I used a function in this script from one of hrshaft's scripts from his pastebin get_tag_info() replace_starting_equipment.lua
  3. I made what you wanted, it does everything except change the player color, and can be configured to behave within ranges. It also has the option to spawn random weapons on the map, but this script only works with stock maps, because I don't know how to traverse tags, you can make it work with a custom map if you edit the weapon lists. randomize_stuff.lua
  4. I'm not going to release or make public the code that was used to create this. It's more of a demonstration of what is possible. It's a pretty roundabout way to accomplish it though, placing a 3D render of halo camera and player data as a transparent window on top of halo in windowed mode. The methods are hacky at best and that introduces latency into the cheat window, I'm sure if it was created using faster 3D rendering techniques rather than using JavaScript the latency would be reduced. I'm somewhat regretting creating this because it possibly introduces more dishonesty into the game, although I'm uncertain whether something like this already exists. I was more interested in whether it could work than whether it should be created.
  5. Is it safe to use os.clock() in an lua script for timing a recurring event in a script? If the server runs constantly will os.clock() have an overflow point? Could it keep counting seconds or milliseconds similar to the unix timestamp? Obviously this would be a pain to test, I didn't see information on this through a few google searches. I have this weapons spawning script where every 30 seconds the weapons are spawned again. It would make more sense to count the ticks and reset a variable rather than depend on os.clock() so it's easy to fix the problem if there is one, I'm just curious about os.clock() I had this script fail, due to an undetermined cause, although I'm unsure whether any of the other scripts were also still working. The information I could find about os.clock() says that it's mostly used for script benchmarking purposes. api_version = "1.12.0.0" items={ { "weap", "weapons\\sniper rifle\\sniper rifle", 90.899, -159.633, 1.704, 1.587 ,0}, } function OnScriptLoad() register_callback(cb['EVENT_TICK'],"OnTick") register_callback(cb["EVENT_GAME_START"], "OnGameStart") end function OnGameStart() if (items) then for i = 1,#items,1 do spawn_object(items[i][1], items[i][2], items[i][3], items[i][4], items[i][5], items[i][6]) items[i][7]=tonumber(os.clock())+30 end end end function OnTick() time = os.clock() for i = 1,#items,1 do if (time>=items[i][7]) then spawn_object(items[i][1], items[i][2], items[i][3], items[i][4], items[i][5], items[i][6]) items[i][7]=tonumber(os.clock())+30 end end end
  6. This is a janky script so I'm not going to release it, but you can use it if you want. SAPP's EVENT_CHAT api is somewhat limited so this is the only way I could find to accomplish this. All chat messages are stopped unless they are / commands and then they are rebroadcasted as server messages without the server prefix. The messages are formatted to appear like player chat messages for team and all chat. Doing that makes it so specific messages to/from players can be muted on an individual basis. If somebody is trolling and you've had enough of their offensive text this could come in handy to anyone on the server. There are no administrative privileges required to run these commands: If you want to mute messages to yourself from a specific player use /deafen <player index> you can use /players to view player indexes, you can also use /undeafen to resume chat messages. There might be some holes in the logic for this but this is the only way I could think to accomplish this. Also vehicle chat isn't accounted for, it's lumped into team chat messages. selective_mute.lua
  7. What the script does: The script will log instances of players connecting using a vpn or proxy in the haloded directory under the filename vpn_log.txt It will also announce to all admins on the server when someone joins with a vpn or proxy The script enables the command /vpn <player index> for admins to check if a player is currently playing on a vpn or proxy The setup of this script requires web hosting, the sapp http client, and requires creating a free account on https://iphub.info/. (iphub.info allows 1,000 free ip lookups per day) The web hosting needs support for PHP and needs to have the Curl module for PHP installed, it would be ideal to have web hosting with an ssl certificate to enable https:// communication The readme.txt goes into detail on the setup instructions, but doesn't include detailed web server setup instructions. Look for guides on how to install a LAMP web server on a vps, or use web hosting that allows ssh access. With ssh access, this script is valuable in enabling a free ssl certificate https://github.com/srvrco/getssl#installation vpn_detector.zip
  8. Submission 1 Detect whether a player joins with a vpn or proxy: https://opencarnage.net/index.php?/topic/8548-detect-vpn-or-proxy/
  9. This is a utility for admins to get real time feedback of a specific player's botscore. aimbot_ban must be enabled for this to work. If you want to measure botscores, but don't want sapp to kick or ban any players put aimbot_ban 20000 4 1 in the sapp init.txt The admin_botscores.lua script enables 2 commands: /botscore [player index] use to show the botscore of a specific player /stopbotscore use to disable botscore messages for yourself You can configure the script to either output the messages to the halo console (default), or the halo chat, whichever you prefer. Each admin player can monitor any player including themselves. Here's a video showing how it works. I'm not using any cheating software in the video. I'm trying my best as a human to track a stationary player's head through a wall. EDIT: I've uploaded admin_botscores3.lua with new features: IMPORTANT: Using this script is will not guarantee catching someone who is cheating and there are lots of false positives involved with sapp's botscore detection. Within testing we've discovered that it's quite possible for a players botscore to go above 1000 during normal play while not using any cheats. It's important to figure out how sapp's detection works before issuing punishments based on botscores or snaps. Spectating or sightjacking is still highly recommended before making decisions. Using /botscore [player index] shows up in the console as a single line instead of the previous behavior of the botscore covering up lots of the visible screen area. I added snap notifications, but this often has false positives, so don't ban or kick players just because of one or two snaps being detected. It's best to observe the system for a while to discern false positive from real positive. If you are logged in as an admin there will be an alert system for every time a players score passes an increment of 500. For example if someone snaps and their score goes to 555 instantly a message will appear to admins that their score exceeded 500. Or if someone is tracking through walls and their score goes above 500 then 1000 the script will notify twice in that case. There is also a cool down effect so if someone's score was 1010 then it slowly drops to 400 then it goes to 555 it would notify again that their bot score went past 500. admin_botscores.lua admin_botscores3.lua
  10. I used AutoHotkey to type characters ANSI 0128-0255 and ASCII 1-255 alt codes over halo chat and then save the results in a couple of files. It might be useful for someone somewhere along the line. The files have only been written to by lua file i/o operation. If you want to use these characters in a script I recommend opening them with notepad++ then saving your current script as ANSI encoding then copy and paste the characters. I don't know if this is all of the possible characters, there may be some missing. I'm curious if anyone knows, will halo will accept other encodings in addition to ascii and ansi within chat or within player names? ansi.txt ascii.txt
  11. EGS allows a one click install of the lua_http_client (Required) This proof of concept leverages that fact to communicate with an http server to which acts as a proxy to send out discord api requests. In theory this works fine, however this collection of scripts is only a test and lacks any functionality of a true solution. There's also the problem of needing to buy/rent a server instance running an https web server in order for any of this to work. You can get away with something that's $5/mo or possibly ~$30 a year if you find some really cheap vps solution, because all it needs to do is act as a proxy, or alternatively use web hosting you already have to accomplish that. The test script should be run off a local web server, all it does is echo halo's chat messages that are sent to 'All' through the discord bot, to a specific discord channel. The webserver needs to have php and the curl extension for php installed. I also included someone's JavaScript solution to authorize the bot through websockets. The php was mostly copied from stackoverflow. I'm a little bit salty that EGS has ghosted my request for uploading of a curl dll so that sapp can make these requests without a need for a proxy. This is a really roundabout solution to the problem. Edit: I was able to make a slightly better version, it allows halo admins to chat back and forth between a discord channel using an https application as a proxy and a discord bot. It's uploaded as discord_proxy.zip Accidental bug in discord_get.php which bypasses the api key, fixed version uploaded as discord_proxy_2 I also included a script to make generating an api key easier EGS_Discord.zip discord_proxy_2.zip
  12. Using something like: execute_command("spawn vehi vehicles\\banshee\\banshee_mp x y z r") or spawn_object() Within an lua script on game start, while a race gametype is loaded up, the vehicles stay where they are until they are moved or driven, but instead of going back to their original spawn point after they are idle they disappear. This is confusing, because using execute_command("spawn etc..") to spawn a vehicle in a slayer gametype, the vehicles behave more or less like normal vehicle spawn, they respawn to where they were positioned at the beginning when they are moved and at idle. Is there some way to keep track of which vehicles have been moved or a way of detecting when they are at idle, to create an artificial timer in lua to have them respawn? I think this is possible for detecting whether they have been driven, or are currently under control of a player, but detecting if they have been moved but never driven sounds more difficult.
  13. 10.2.1 is the latest version of sapp.dll 1.10 is the latest version of haloceded.exe http://hce.halomaps.org/index.cfm?fid=6797 I'm unsure which version of haloceded.exe is included in the download from http://xhalo.byethost18.com/, but I don't think you want that version, it's definitely not 1.10. That's also a very old version of sapp.dll from the looks of the web page. Edit: You can also get haloceded.exe from here, but the version of sapp.dll included with it doesn't work on linux https://www.elitegameservers.net/sapp/download you would replace or use the sapp.dll and strings.dll with the ones from https://opencarnage.net/applications/core/interface/file/attachment.php?id=1154 to get it to work on linux.
  14. This doesn't answer your question, but this post ended up fixing my issues: I wasn't able to get sapp to run on ubuntu 20.04 unless I used the version of sapp linked in the above post. However, I'm using a 1.10 version of haloded.exe I'm not sure whether it would work with previous versions. What patch version of haloceded.exe are you using? I was able to run wine 5.0 with haloded 1.10 and sapp 10.2.1 on ubuntu 20.04 by using the SAPP.7z download in the above post. Make sure you run haloded in a 32bit wine prefix also: https://askubuntu.com/questions/177192/how-do-i-create-a-32-bit-wine-prefix
  15. I've made 3 scripts for 3 different use cases, every one of them requires that you put: cheat_jetpack true into your sapp init.txt, or you could toggle it using events.txt on the condition that the map boardingaction is loaded. These scripts also require configuration, the coordinates that are included are only examples, so you will have to find where you want people to be teleported by using /coord from a sapp server to find the x,y,z coordinates. The teleportation is triggered when a player goes below -5 in the z coordinate space. I think the lowest point that you can walk on in boarding action is -4.78. If you fall from level 5 in the map then the falling damage will kill you before you get to -4.78, thus the requirement of cheat_jetpack true. All the scripts will only teleport on the condition that the map boardingaction is loaded, if you run another map those won't be affected. I didn't test this with antiglitch enabled, but it seems to work without antiglitch. ba_no_fall.lua One set location for players to be teleported to, doesn't matter what gametype or team or anything, everyone who falls off is teleported to that location. ba_no_fall_multiple.lua You can program in as many teleport locations you want, and one will be selected from the list using math.random() (randomly) for a player to teleport to. However red and blue teams will share the same pool of teleports that can be chosen. ba_no_fall_multiple_teams.lua Red and blue teams both have a separate pool of random places that they teleport to after falling into the abyss, they have to be programmed in separate arrays of {x,y,z} coordinates, but it works the same as ba_no_fall_multiple.lua, only it has different teleports dedicated to each team. Chalwk's github helped make these scripts possible, thanks! ba_no_fall.lua ba_no_fall_multiple.lua ba_no_fall_multiple_teams.lua
  16. I honestly have never tested changing that memory address, I was thinking that with sapp 10.2.1 the cd key check is disabled out of the box. I tried some code, this ended up crashing haloded with an exception error, but I'm using sapp 10.2.1. With 10.2.1 I never had a problem with cd key checks, I also don't know if those memory addresses or correct, or when to write to them. It could be a completely different address that is created by sapp that needs to be changed. Those addresses in offsets.lua probably pre-date halo patch 1.10 and are geared towards phasor. api_version = "1.12.0.0" function OnScriptLoad() register_callback(cb["EVENT_GAME_START"], "OnGameStart") end function OnGameStart() --PC --hashcheck_patch = 0x59c280 --CE hashcheck_patch = 0x530130 write_byte(hashcheck_patch, 0xEB) -- Disables Halo's hash check (0x74 to reenable) end
  17. The unrestricted version of Gandanur: http://www.gandanur.com/ It has a command for disabling the cd-key check, however installation of Gandanur requires replacement of haloded.exe and strings.dll. It might be possible to use gandanur along with cheat engine and keep running the command: sv_cdkeycheck 1 sv_cdkeycheck 0 sv_cdkeycheck 1 sv_cdkeycheck 0 etc... Then use cheat engine to search for a bit value in haloded.exe of something being toggled between 0 and 1 based on what you changed it to using gandanur, however the fact that gandanur requires haloded.exe to be replaced with their own version makes me think that the memory address may or may not be correct if you tried to write to the same address in the copy of haloded.exe that sapp uses. If this doesn't work then gandanur is a solution for disabling the cd key check if you don't want to use phasor or sapp. Edit: I didn't test to see whether this works, but there is a memory address specified here: https://github.com/Chalwk77/HALO-SCRIPT-PROJECTS/blob/ca1bcdf2636debc4e3622fff48614626bb7b3043/Miscellaneous/offsets.lua --PC --hashcheck_patch = 0x59c280 --CE hashcheck_patch = 0x530130 write_byte(hashcheck_patch, 0xEB) -- Disables Halo's hash check (0x74 to reenable)
  18. What's your desktop resolution and refresh rate while not running halo? Or what's the highest resolution and refresh rate that your monitor supports? I know some monitors do both 60hz and 75hz. If you run in windowed mode halo is forced to your monitor's refresh rate regardless of what's specified using -vidmode (at least I think this is true). I'm fairly certain that anything like chimera or hac2 and other things create or come with configuration files, you could locate and modify or delete those configuration files, then they will generate a default set once you run halo again. Or delete those addons along with the configuration files then re-copy a fresh set. If you uninstall halo that might not delete the configuration files associated with chimera or hac2, I think those have to be manually deleted. But it's worth a shot, however if you never edited those config files then it's kinda a long shot to delete them as a solution. There should be an .ini file in the halo root directory, and also more config files in My Documents\My Games\Halo ... there should be a "hac" and/or "chimera" folder there.
  19. If you have chimera installed then I'm not sure how to troubleshoot the issue, but if you don't have chimera then this is what I would try: If you right click and select properties of the halo shortcut either in program files or on the desktop, then add a space to the end of the target line after the quotes " " to make it look like: ... halo.exe" -vidmode 1600,900,60 it works like: -vidmode width,height,monitor hz I think using -vidmode will force vsync but it should run the game at the monitors refresh rate rather than 30 fps If your monitor is capable of more than 60hz change it to whatever it can accept at 1600x900 You can also try running it in windowed mode to see if that changes anything ... halo.exe" -window -vidmode x,y,hz or ... halo.exe" -window
  20. I want to preface this by saying that I had not written any C++ before I started working on this, and also that I don't know how to manage memory within C++. I would not recommend using this on your halo server because it could potentially crash it if not used correctly. This is more like an overview of how an async C function call can work within lua. The .dll seems to work under the circumstances, but I don't know how everything works within the C++ code, so it definitely shouldn't be used in any production environment. I would not have been able to figure out how to make the dll if it were not for these posts, I used the structure from Discord Webhooks Script dllmain.cpp, and the lua timer structure from the sapp http client, also special thanks to a halo player named dummkopf. Using Visual Studio 2019 on Windows 10, I followed this guide to setup the environment with libcurl to compile the dll https://medium.com/@farhabihelal/how-to-set-up-libcurl-on-visual-studio-2019-a9fdacce6945 The dll can only make one request at a time, lua can pass in a url and post data through the request, and the request is completed asynchronously. I'm fairly confident halo will not lag no matter how long the webserver takes to respond. The text response is stored in an lua variable so that you can do whatever needs to be done with it. It sort of performs an http get and post request at the same time where get variables are passed through the query string, and the post data is passed to the 2nd parameter of curl_request(). If any of the C functions are called out of order then it could crash the server, and I haven't figured out how to create curl request instances, thus only one request at a time, then wait, then make the next one. The dllmain.cpp could be modified from documentation https://curl.se/libcurl/c/libcurl-easy.html to perform any http method, however the compiled dll in the zip only supports http get/post. There are lots of comments in the sources to help. The curl_test.7z includes: dllmain.cpp - C++ code that can compile with visual studio 2019 curl_test.dll - dll that I compiled with visual studio 2019 (put this in the same directory as haloded.exe) I didn't test this on wine or anything other than windows 10 curl_test.lua - example lua script that allows curl_test.dll to be loaded and called sleep.php - put this at the root directory of a web server with PHP installed (you can install xampp and put it in C:\xampp\htdocs) This was mainly for testing whether curl was performed using async and to echo back post variables Honestly though if someone has experience writing C/C++ out there this is a decent enough base to create C functions that won't lag the halo server, but the C++ that I cobbled together is not very good due to my lack of understanding of C++. I guess I'm looking for someone to come and improve this idea, but I might try to figure out a better way of doing it after I learn more. Problems running with wine: I was testing the dll included in the zip, and it looks like I compiled it in debug mode rather than release mode, also I attempted to ffi load the dll while running haloded.exe through wine and it asks for VCRUNTIME140D.dll and ucrtbased.dll which could not be found it led me to this https://stackoverflow.com/questions/6261034/building-dll-for-lower-version-of-visual-studio which it looks like it will be necessary to learn about the solutions described in this question in order to compile a working dll for wine. The VC++ 2010 runtime has a platinum rating on winehq.org, https://appdb.winehq.org/objectManager.php?sClass=application&iId=5766, my assumption is to somehow obtain a legitimate copy of visual studio 2010 or the VC++ 2010 compiler and compile the dll using that. Then use: winetricks vcrun2010 within the 32bit wine prefix that the halo server is run in. In addition visual studio 2010 would somehow have to work with libcurl, which hopefully it would. Ignore the grayed out text, if you open the solution properties in visual studio 2019 before writing any code, then specify the platform toolset as the 2015 version, not the 2015 xp version, then the compiled dll will work under wine after running: winetricks vcrun2015 within the 32 bit wine prefix, and make sure to compile in release mode and not debug mode, or wine will throw an error trying to load the dll, I also uploaded the VC++ 2015 version of the dll as culr_test_wine.dll.7z, it has an identical source to the dllmain.cpp, only that it works with wine, and should work on windows as well after installing the VC++ 2015 runtime. Using winetricks vcrun2015 over ssh may require the ssh -X option to forward x11 applications because there is a graphical popup to accept the Microsoft terms of the redistributable. I would really like to find a way to compile the dll without the need for any runtime redist, but I haven't figured that out. Other Notes: If some protection were added with extra bool values within the dllmain.cpp and wrapping some of the code within an if statement so that certain functions could only be called after others had been completed then improper usage of the C functions causing the server to crash could most likely be avoided. There should probably be an if statement within do_curl() in dllmain.cpp so that if you pass an empty string as the 2nd parameter in lua like: curl_client.curl_request("http://localhost/sleep.php?wait_time=4","") Then curl should not perform with any post data or so that post would not be a part of the request, because sending post data to a dynamic web page whether it be PHP or anything, if the page is setup in such a way that you send post data when it doesn't expect any or doesn't need any it could possibly fail on the server side. I don't have an example of this happening, but it would be a good idea to have it operate like a switch rather than sending blank post data. In other words, wrap curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data); in an if statement so that if post_data is an empty string don't include it in the request. There is no current error reporting or checking, get_curl_status()==true only means that the curl portion of the C++ has completed, if curl was unable to contact the web server there's no real way to tell. I believe if it failed you'll get back an empty string "" from get_curl_text_response() yet if you were already expecting an empty response from the web server it would be difficult to discern whether there was an error. Queue of requests: curl_test_queue.7z contains: curl_test_queue.lua This is one example of how lua can create a queue for curl_test_wine.dll, an lua table of outgoing requests can be done one after another, where the timer loop is constantly running checking for more data in the table, sending all of it out until there's no more entries in the table. There's probably also a way to trigger the timer loop rather than to have it constantly running if there's no data to be sent, but I didn't include that in the code. log_player.php This appends the data sent from lua to the http server to a file in the same directory where the php script is located called halo_players.txt that contains the name of the player who joined and the current unix timestamp. It has to be run within a web server compatible with php. Setting custom headers: Sorry for this messy edited timeline of work, but curl_test_headers.7z works the same as curl_test_wine, however lua is given the opportunity to pass custom headers using the curl rules outlined in this doc https://curl.se/libcurl/c/httpcustomheader.html I believe I also fixed a memory leak in the program, but I don't have any way to know for sure, or don't know how. I also added some protection for the functions just in case they get called out of order. So this should be considered the "stable version" although relatively "stable" compared to previous attempts. I've played a little with this code https://gist.github.com/ianklatzco/c033b33757915feaf48fd0caf14b42cb for running curl from bash to communicate with a discord bot, but I vaguely remember there needing to be an initial authorization that has to be done before the bot will accept requests, which may or may not hinder trying to create one in within lua using this dll. Setting custom method: It's on my todo list to add an lua counterpart to add an option and parameter to change this libcurl function: curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, <string from lua here>); so that something like "DELETE", "PATCH", or "PUT" etc... can be used. sapp_curl_1.7z: I'm happy with the way this turned out and I did some testing with it and included 2 examples of how sapp_curl_1.dll can be used within lua to query the discord API, and in turn instruct a discord bot to do things. Due to the massive number of options here: https://curl.se/libcurl/c/curl_easy_setopt.html I think it would be wise to stop development. The dllmain.cpp could easily be restructured to include any of those options, but sapp_curl_1.dll is simple enough to get started with http api requests or sending any http method along with data. There is a quirk where if you are sending JSON data with sapp_curl_1.dll it may have been a good idea to format that as UTF-8 within the .dll, but it may be possible to do that within lua. I might try to figure out either method whether lua or cpp to send special characters, but the fix that I've put in the discord lua examples is a hack method that is reliable at changing the data to be acceptable but won't send special characters. I believe that the post data must be ASCII encoded. The included examples go into a lot more detail of usage, so I'm not going to put that information here, but you can set custom headers, and set custom request methods, and custom post data, and turn standard output messages on and off. It looks like attempting to detect the charset given to sapp_curl_1.dll and then convert to utf-8 is a problem that would require quite a bit of work. I'm unsure how lua is deriving the charset from any data that is passed to it, so it could possibly be any charset. Making a list of all the ascii characters and making sure that the data you send is one of those characters seems like an easy fix, but no special characters are able to get sent. If there was a way to force lua to encode a particular string with a certain charset all the time once it's sent to sapp_curl_1.dll it would make life a lot easier, but there are also ways of detecting charsets within a C/C++ program, however there are quite a few that would need to be set up to be detected. I even went so far as to think that possibly url encoding then url decoding the string, or somewhere in the process of doing that might make this easier to figure out https://help.interfaceware.com/code/details/urlcode-lua send all post data as a url encoded string, then you could decode it once it was passed to the dll, however that seems like a wild goose chase. I've hit a point where I need to learn more before being able to make improvements: https://stackoverflow.com/questions/16208079/how-to-work-with-utf-8-in-c-conversion-from-other-encodings-to-utf-8 Nevermind the issue above is solved in with this stackoverflow question: https://stackoverflow.com/questions/16624036/how-to-convert-windows-1256-to-utf-8-in-lua it probably works for both halo chat and names chosen in halo. There is also probably some usage of lua's string.byte() that can be done beforehand to make sure you aren't trying to convert a string with a character represented by a byte valuer greater than 255. It makes me think about the halo name hack program and I'm wondering if it would inject characters into a player's name that have a byte value greater than 255, I don't know enough about how the halo client/server handles names and chat strings in order to give a solution that will always work even if someone was being naughty with the strings that you can get from get_var(PlayerIndex,"$name") and also the Message parameter from register_callback(cb["EVENT_CHAT"], "OnPlayerChat") in sapp. sapp_curl_2.7z is the current version: I fixed a dumb mistake by making sure: curl_slist_free_all(chunk); gets called, this probably would have been bad over long periods of use. I did some unorthodox stress testing attempting to see how reliable the dll was. I did ~500,000 requests at ~250 requests per second with everything being done over localhost, and 99 header rules, and 1000 characters of data per request. So far as I can tell the memory usage of the machine I was running it on while running with wine did not increase as if there was a leak. Connecting to the halo server through localhost while this was going on with 1 player it seemed as everything was normal, which seemed kind of comical because haloded.exe was hovering around 20% cpu usage (i5 6600k). Errors: As of the time of writing this there is no error reporting for curl within the dll, you are at the mercy of the api endpoint to give relevant errors, but an empty string "" will be returned if curl fails for whatever reason. An example would be the webserver not being able to be contacted because there is no webserver running at the hostname of the url does not exist, curl will return "" after a pre-defined amount time because the webserver did not exist. This could happen for any number of reasons, like a dns lookup failed, or you aren't connected to the internet, trying to request from exampel.com instead of example.com, etc... The name of the sapp_curl_x.dll is arbitrary, and in order to load whichever version you downloaded: curl_client = ffi.load("sapp_curl_x") replace the name within the quotes with the file name of the dll, you can also rename it to anything and use that name instead, and I don't think you have to put .dll on the end in order for lua to load it. The dll should be put in the same directory that contains the halo server i.e. the same location of sapp.dll and haloded Todo list: File posting https://curl.se/libcurl/c/postit2.html curl_slist_free_all(chunk); needs to be added when custom headers are specified (Done) Reason for making this and future thoughts: I wanted a portable solution that could contact http api's that was also not going to lag the halo server. The sapp_http_client is a better option if you only need to make GET requests. I'm still wondering whether this sapp curl dll would be compatible with a service like elite game servers, I'm hoping / praying that they have a way to use the VC++ 2015 runtime and will accept the .dll if they are asked to upload it to a service. If services like elite game servers will accept the dll then that opens up some lua programming freedom on EGS for script writers to create interactions with http api's that require more than the GET method. EGS doesn't care too much if you upload any lua script by yourself and write your own lua scripts for sapp. But they disallow uploading of .dll files unless you open a ticket with them. The sapp_http_client has already been added to their list of mods that can be "one click" installed, so I'm hoping this can get on that list too, but I would like someone to review the dllmain.cpp before that happens. Of course improper use of the dll within lua will crash the server, and it could be warped and twisted into a cpu sucking program if used improperly in lua. I'm hoping it's treated with respect and not abused, waiting 250ms between initiating and processing a request is just an arbitrary number that I put in the examples, but changing that number is up to the lua programmer to decide. curl_test.7z curl_test_wine.dll.7z curl_test_queue.7z curl_test_headers.7z sapp_curl_1.7z sapp_curl_2.7z
  21. I sent EGS a ticket, and they say the shell exec from sapp lua is no-go. I was using shared linux vps hosting, but ran into the noisy neighbors effect and got some bad lag so I went back to EGS. For 1 to 2 servers EGS is fine I think although the complete lack of control over anything is one of the compromises of price and reliability. EGS added a plugin script to auto-install the sapp http client that Kavawavi made. I was doing some testing with the client and it can request urls up to around ~8100 characters long, probably 8000 or less to keep things safe. Would you consider writing in a compatibility layer to use the sapp http request to bring your script to locked down hosting like EGS?
  22. I really wish I knew enough to be able to create ffi libraries for lua/sapp. Sorry for my rambling post earlier, I think having no available source for the webserver side of things started to make me go crazy with questions in my mind of things to look out for. If I can get elitegameservers.net to upload wget.exe along with its .dll files I would be willing to help send you some info, I've got this server on retail SuicideBomber3 104.192.224.11:2301, that gets a good amount of traffic, it's ffa. I don't know if elitegameservers.net runs windows for hosting but I really don't know if they allow a shell to pulled up from lua. If your website has ssh access you can get a free signed ssl certificate and enable https, it would help a bit with securing data, it's the only reason I felt comfortable with sending information through a url rather than post. This is what I used: https://github.com/srvrco/getssl
  23. Thanks, I think an ffi module that was capable of doing any http method that would not cause lag would be an indispensable asset to any web related integration. The project that I was working on completely lacked an api portion, but I was thinking about how it would be useful. I'm thinking what if a nefarious group of players decide they want to make up a UUID? Then concatenate that value through the chimera script, rather than the real UUID from their C: drive, and then they all use that same UUID among them? There would probably be some logic somewhere on the server side to account for a problem like that. Also if they all logged in through a vpn while using that shared UUID their ip addresses would more or less look like a single player, except their names would be different if they were all playing on the same server at the same time. And they could make the UUID follow the same format as one that would be obtained from a drive. Sorry this is just where my mind goes with this stuff. execute_script('rcon uuid cl_uuid '..'some_uuid_here') Edit: I guess when the end report is known by the webserver and it encounters any duplicate uuid from different players, it could flag that uuid for abuse, and/or toss that information out. I guess the most they could do at that point would be to work in shifts, especially if 2 games going on 2 different servers had the same uuid at the same time and that could also be detected.
  24. Ash vs Evil Dead (Lots of gore), Futurama (Cartoon comedy), It's Always Sunny in Philadelphia (Comedy), Breaking Bad (Crime Drama), Doctor Who (Science Fiction) There's also lots of anime out there too, Death Note, Full Metal Alchemist Brotherhood, Hunter x Hunter, Mob Psycho 100, One Punch Man, Assassination Classroom, Initial D, but I'm bad about watching anime unless it's english dubbed. A movie based on the first person shooter video game genre is Hardcore Henry, lots of gore and some nudity though.
  25. Great work, this release solves many problems I've run into while trying to make something similar. I spent my time dillydallying instead of working on the web stats thing that I was working on. I guess the ideology is different in releasing source for the server code, so I may still have a chance at continuing work, but most likely I'll continue my procrastination. The method I fell back on for uniquely identifying players only depends on IP+Name if either of those things change it's considered a different player, but the UUID seems like an interesting workaround to the problem of halo being pretty much anonymous. I was considering consolidating, or having an option to treat "unique" players as the same if they had the same name and if their different IP addresses were relatively on the same network. It wouldn't be possible for players to see other's UUID, but could they edit the chimera portion to send a pre-fabricated UUID? The http request for sapp can do requests, although I think limited to the get method, without lagging or doing them on the main thread. Even if the web server takes 10 seconds or longer to even send back a response there's no lag using the async method and putting part of the code in a timer. I'm unsure if you already found a way around the lag with the system shell call to powershell or wget. Edit: Sorry, I feel like I'm putting up too much criticism of your release, but I'm very curious about the methods you used because of my attempt in creating something similar.