Jump to content

Recommended Posts

Posted (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 by MasterDeeJay
fixed the code
  • MasterDeeJay changed the title to Server status query mod (online players, date, temperature, wind...etc) example VS code
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.