MasterDeeJay Posted March 22, 2025 Report Posted March 22, 2025 (edited) I have started to create a server status mod for my server. It generates json http and the web server connect to it. I am a beginner and my english is not perfect. Currently i can query a few things. https://vintagestory.hu/ I can query the online players, temperature near outside player, location. Year (0 but i added 1386 just for fun), Month (and seasson on the north side of the map) But i need some help to query the following: Wind direction and speed rain strength (i only got precipitation but that gives me 0 or 1 not the strength) humidity possible? rift activity? The current code is (free to use) using System.Net; using System.Text.Json; using System.Text; using System.Threading.Tasks; using Vintagestory.API.Common; using Vintagestory.API.Server; using System; using System.Collections.Generic; public class PlayerWeatherMod : ModSystem { private ICoreServerAPI api; private HttpListener httpListener; private string url = "http://+:8181/"; public override void StartServerSide(ICoreServerAPI api) { this.api = api; httpListener = new HttpListener(); httpListener.Prefixes.Add(url); httpListener.Start(); httpListener.BeginGetContext(HandleRequest, httpListener); api.Logger.Notification("PlayerWeatherMod HTTP szerver elindítva: " + url); } private async void HandleRequest(IAsyncResult result) { try { var listener = (HttpListener)result.AsyncState; var context = listener.EndGetContext(result); listener.BeginGetContext(HandleRequest, listener); var response = context.Response; response.AddHeader("Access-Control-Allow-Origin", "*"); response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); response.AddHeader("Access-Control-Allow-Headers", "Content-Type"); response.ContentType = "application/json"; response.StatusCode = 200; var data = new { players = await GetOnlinePlayersWithDetailsAsync(), weather = GetWeatherInfo(), date = GetGameDate() }; byte[] buffer = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(data)); await response.OutputStream.WriteAsync(buffer, 0, buffer.Length); response.Close(); } catch (Exception ex) { api.Logger.Error("Hiba történt a HTTP kérés feldolgozása közben: " + ex.Message); } } private async Task<List<object>> GetOnlinePlayersWithDetailsAsync() { return await Task.Run(() => { List<object> players = new List<object>(); foreach (var player in api.World.AllOnlinePlayers) { var pos = player.Entity.Pos.AsBlockPos; var climate = api.World.BlockAccessor.GetClimateAt(pos, EnumGetClimateMode.NowValues); players.Add(new { Name = player.PlayerName, Temperature = climate.Temperature, Rainfall = climate.Rainfall, Coordinates = new { X = pos.X, Y = pos.Y, Z = pos.Z } }); } return players; }); } private object GetWeatherInfo() { var pos = api.World.DefaultSpawnPosition.AsBlockPos; var climate = api.World.BlockAccessor.GetClimateAt(pos, EnumGetClimateMode.NowValues); return new { Temperature = climate.Temperature, Rainfall = climate.Rainfall }; } private object GetGameDate() { var calendar = api.World.Calendar; string[] monthNames = { "Január", "Február", "Március", "Április", "Május", "Június", "Július", "Augusztus", "Szeptember", "Október", "November", "December" }; string monthName = monthNames[(int)calendar.Month % 12]; return new { Year = calendar.Year, Month = monthName }; } public override void Dispose() { httpListener?.Stop(); httpListener?.Close(); api.Logger.Notification("PlayerWeatherMod HTTP szerver leállítva."); } } Thanks for any help! Edited April 22, 2025 by MasterDeeJay fixed the code
Recommended Posts