88 lines
3.1 KiB
Python
88 lines
3.1 KiB
Python
from giants.map import Map
|
|
from giants.player import Player
|
|
from dpnet.netserver import Netserver
|
|
from dpnet.session import Session
|
|
import socket
|
|
import importlib
|
|
import os
|
|
from giants import Teams, GameTypes
|
|
from utils.logger import setup_logger
|
|
import traceback
|
|
|
|
logger = setup_logger(__name__)
|
|
|
|
|
|
class Server:
|
|
def __init__(self, **kwargs):
|
|
self.listen_ip = kwargs.get("ip", "0.0.0.0")
|
|
self.listen_port = kwargs.get("port", 19711)
|
|
fake_session = Session(socket.socket(socket.AF_INET, socket.SOCK_DGRAM))
|
|
fake_session.ip = "127.0.0.1"
|
|
fake_session.port = 3333
|
|
self.players = [Player("Amazed4", fake_session)]
|
|
self.currentmap = kwargs.get("map", Map("Three Way Island - Canyons.gck"))
|
|
self.maxplayers = kwargs.get("maxplayers", 20)
|
|
self.name = kwargs.get("name", "Default Server Name")
|
|
self.accept_new_players = True
|
|
self.register_with_ms = kwargs.get("register", False)
|
|
self.teams = kwargs.get("teams", Teams.MvM)
|
|
self.game_type = kwargs.get("gametype", GameTypes.TeamDeathmatchWithFullBase)
|
|
self._plugins = []
|
|
|
|
def add_player(self, player):
|
|
self.players.append(player)
|
|
self._broadcast_event("on_player_join", player)
|
|
|
|
def add_plugin(self, plugin):
|
|
self._plugins.append(plugin)
|
|
|
|
def change_map(self, mappath):
|
|
try:
|
|
self.currentmap = Map(mappath)
|
|
self._broadcast_event("on_map_change", self.currentmap)
|
|
except Exception:
|
|
logger.error("Could not change map")
|
|
|
|
def _broadcast_event(self, event, *args):
|
|
logger.debug("Broadcasting event "+event)
|
|
for plugin in self._plugins:
|
|
if hasattr(plugin, event):
|
|
func = getattr(plugin, event)
|
|
if callable(func):
|
|
try:
|
|
func(args)
|
|
except Exception:
|
|
logger.error("Could not call plugin function: "+plugin.__name__+"."+event)
|
|
traceback.print_exc()
|
|
|
|
def load_plugins(self):
|
|
plugins = os.listdir("plugins")
|
|
for plugin in plugins:
|
|
if os.path.isdir("plugins/"+plugin) or plugin == "__init__.py":
|
|
continue
|
|
if not plugin.endswith(".py"):
|
|
continue
|
|
pluginname = plugin.split(".py")[0]
|
|
try:
|
|
module = importlib.import_module("plugins."+pluginname)
|
|
if hasattr(module, "setup"):
|
|
setup = getattr(module, "setup")
|
|
if callable(setup):
|
|
logger.info("Loading plugin "+module.__name__)
|
|
module.setup(self)
|
|
except Exception:
|
|
logger.warn("Could not load plugin "+plugin)
|
|
traceback.print_exc()
|
|
|
|
def broadcast_message(self, text):
|
|
for player in self.players:
|
|
player.session.send_gamedata(b'\x35\x80\x81'+text.encode("ascii")+b'\x00\x00')
|
|
|
|
def run(self):
|
|
self.load_plugins()
|
|
return Netserver(self).run()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
server = Server(name="giantsd", maxplayers=10, register=False)
|
|
server.run() # blocking |