Skip to content

Commit

Permalink
feat(gamemode): ✨ support MCDR 2.0
Browse files Browse the repository at this point in the history
Release-As: 0.1.0
  • Loading branch information
AnzhiZhang committed Jun 30, 2022
1 parent afcad9b commit d999f4a
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 71 deletions.
132 changes: 94 additions & 38 deletions gamemode/gamemode/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@
import time
from math import ceil, floor

from mcdreforged.api.types import PluginServerInterface
from mcdreforged.api.types import PluginServerInterface, PlayerCommandSource
from mcdreforged.api.command import *
from mcdreforged.api.decorator import new_thread
from mcdreforged.api.utils import Serializable
from gamemode.json import Json

import minecraft_data_api

DIMENSIONS = {
'0': 'minecraft:overworld',
Expand Down Expand Up @@ -40,25 +41,34 @@
§6!!tp [dimension] [position] §7传送至指定地点
§6!!back §7返回上个地点'''


class Config(Serializable):
spec: int = 1
spec_other: int = 2
tp: int = 1
back: int = 1


config: Config
data: dict


def nether_to_overworld(x, z):
return int(float(x)) * 8, int(float(z)) * 8


def overworld_to_nether(x, z):
return floor(float(x) / 8 + 0.5), floor(float(z) / 8 + 0.5)


def on_load(server: PluginServerInterface, old):
global api, data
api = server.get_plugin_instance('minecraft_data_api')
permissions = server.load_config_simple('config.json', default_config=DEFAULT_CONFIG, target_class=Config)
data = Json("gamemode")
global data
permissions = server.load_config_simple(
'config.json',
default_config=DEFAULT_CONFIG,
target_class=Config
)
data = server.load_config_simple('data.json', default_config={})

server.register_help_message('!!spec help', 'Gamemode插件帮助')

Expand All @@ -76,11 +86,11 @@ def change_mode(src, ctx):
spec_to_sur(server, player)

@new_thread('Gamemode tp')

def tp(src, ctx):
def tp(src: PlayerCommandSource, ctx):

def coordValid(a):
if a.count('-') > 1 or a.count('.') > 1 or a.startswith('.') or a.endswith('.'):
if a.count('-') > 1 or a.count('.') > 1 or a.startswith(
'.') or a.endswith('.'):
return False
a = a.replace('-', '')
a = a.replace('.', '')
Expand Down Expand Up @@ -108,57 +118,96 @@ def coordValid(a):
pos = ''
humpos = ''

if len(params) == 1: # only dimension
if len(params) == 1: # only dimension
if params[0] not in DIMENSIONS.keys():
src.reply('§c没有此维度')
elif DIMENSIONS[params[0]] == DIMENSIONS[api.get_player_info(src.player, 'Dimension')]:
elif DIMENSIONS[params[0]] == DIMENSIONS[
minecraft_data_api.get_player_info(src.player, 'Dimension')
]:
src.reply('§c您正在此维度!')
elif (DIMENSIONS[params[0]] == 'minecraft:the_nether') and (DIMENSIONS[api.get_player_info(src.player, 'Dimension')] == 'minecraft:overworld'):
elif (DIMENSIONS[params[0]] == 'minecraft:the_nether') and (
DIMENSIONS[
minecraft_data_api.get_player_info(
src.player, 'Dimension'
)
] == 'minecraft:overworld'):
dim = DIMENSIONS[params[0]]
orgpos = [str(x) for x in api.get_player_info(src.player, 'Pos')]
orgpos = [
str(x) for x in
minecraft_data_api.get_player_info(src.player, 'Pos')
]
newposx, newposz = overworld_to_nether(orgpos[0], orgpos[2])
pos = ' '.join((str(newposx), orgpos[1], str(newposz)))
humpos = ' '.join((str(newposx), str(int(float(orgpos[1]))), str(newposz)))
elif (DIMENSIONS[params[0]] == 'minecraft:overworld') and (DIMENSIONS[api.get_player_info(src.player, 'Dimension')] == 'minecraft:the_nether'):
humpos = ' '.join(
(str(newposx), str(int(float(orgpos[1]))), str(newposz))
)
elif (DIMENSIONS[params[0]] == 'minecraft:overworld') and (
DIMENSIONS[
minecraft_data_api.get_player_info(
src.player, 'Dimension'
)
] == 'minecraft:the_nether'):
dim = DIMENSIONS[params[0]]
orgpos = [str(x) for x in api.get_player_info(src.player, 'Pos')]
orgpos = [
str(x) for x in
minecraft_data_api.get_player_info(src.player, 'Pos')
]
newposx, newposz = nether_to_overworld(orgpos[0], orgpos[2])
pos = ' '.join((str(newposx), orgpos[1], str(newposz)))
humpos = ' '.join((str(newposx), str(int(float(orgpos[1]))), str(newposz)))
humpos = ' '.join(
(str(newposx), str(int(float(orgpos[1]))), str(newposz))
)
else:
dim = DIMENSIONS[params[0]]
pos = '0 80 0'
humpos = '0 80 0'

elif len(params) == 3: # only position
elif len(params) == 3: # only position
if not coordValid(params[0]):
src.reply('§c坐标不合法')
else:
dim = DIMENSIONS[api.get_player_info(src.player, 'Dimension')]
pos = ' '.join((str(float(params[0])), str(params[1]), str(params[2])))
humpos = ' '.join((str(int(float(params[0]))), str(int(params[1])), str(int(params[2]))))
dim = DIMENSIONS[
minecraft_data_api.get_player_info(src.player, 'Dimension')]
pos = ' '.join(
(
str(float(params[0])),
str(params[1]),
str(params[2])
)
)
humpos = ' '.join(
(
str(int(float(params[0]))),
str(int(params[1])),
str(int(params[2]))
)
)

elif len(params) == 4: # dimension + position
elif len(params) == 4: # dimension + position
if params[0] not in DIMENSIONS.keys():
src.reply('§c没有此维度')
else:
dim = DIMENSIONS[params[0]]

pos = ' '.join((str(params[1]), str(params[2]), str(params[3])))
humpos = ' '.join((str(int(params[1])), str(int(params[2])), str(int(params[3]))))
humpos = ' '.join(
(str(int(params[1])), str(int(params[2])), str(int(params[3])))
)

if dim != '' and pos != '' and params != '':
data[src.player]['back'] = {
'dim': DIMENSIONS[api.get_player_info(src.player, 'Dimension')],
'pos': api.get_player_info(src.player, 'Pos')
'dim': DIMENSIONS[
minecraft_data_api.get_player_info(src.player, 'Dimension')
],
'pos': minecraft_data_api.get_player_info(src.player, 'Pos')
}
data.save()
server.save_config_simple(data, 'data.json')
server.execute(f'execute in {dim} run tp {src.player} {pos}')
humdim = HUMDIMS[dim]
src.reply(f'§a传送至§e{humdim}§a, 坐标§e{humpos}')

@new_thread('Gamemode back')
def back(src):
def back(src: PlayerCommandSource):
if src.is_console:
return src.reply('§c仅允许玩家使用')
if src.player not in data.keys():
Expand All @@ -167,12 +216,17 @@ def back(src):
dim = data[src.player]['back']['dim']
pos = [str(x) for x in data[src.player]['back']['pos']]
data[src.player]['back'] = {
'dim': DIMENSIONS[api.get_player_info(src.player, 'Dimension')],
'pos': api.get_player_info(src.player, 'Pos')
'dim': DIMENSIONS[
minecraft_data_api.get_player_info(
src.player, 'Dimension'
)
],
'pos': minecraft_data_api.get_player_info(src.player, 'Pos')
}
data.save()
server.save_config_simple(data, 'data.json')
server.execute(
f'execute in {dim} run tp {src.player} {" ".join(pos)}')
f'execute in {dim} run tp {src.player} {" ".join(pos)}'
)
src.reply('§a已将您传送至上个地点')

server.register_command(
Expand All @@ -196,14 +250,16 @@ def back(src):
requires(lambda src: src.has_permission(permissions.tp)).
then(
Text('param1').
runs(tp). # !!tp <dimension> -- param1 = dimension
runs(tp). # !!tp <dimension> -- param1 = dimension
then(
Float('param2').
then(
Float('param3').
runs(tp). # !!tp <x> <y> <z> -- param1 = x, param2 = y, param3 = z
runs(
tp). # !!tp <x> <y> <z> -- param1 = x, param2 = y, param3 = z
then(
Float('param4').runs(tp) # !!tp <dimension> <x> <y> <z> -- param1 = dimension, param2 = x, param3 = y, param4 = z
Float('param4').runs(tp)
# !!tp <dimension> <x> <y> <z> -- param1 = dimension, param2 = x, param3 = y, param4 = z
)
)
)
Expand All @@ -217,8 +273,8 @@ def back(src):


def sur_to_spec(server, player):
dim = DIMENSIONS[api.get_player_info(player, 'Dimension')]
pos = api.get_player_info(player, 'Pos')
dim = DIMENSIONS[minecraft_data_api.get_player_info(player, 'Dimension')]
pos = minecraft_data_api.get_player_info(player, 'Pos')
data[player] = {
'dim': dim,
'pos': pos,
Expand All @@ -229,7 +285,7 @@ def sur_to_spec(server, player):
}
}
server.execute(f'gamemode spectator {player}')
data.save()
server.save_config_simple(data, 'data.json')


def spec_to_sur(server, player):
Expand All @@ -239,7 +295,7 @@ def spec_to_sur(server, player):
'execute in {} run tp {} {}'.format(dim, player, ' '.join(pos)))
server.execute(f'gamemode survival {player}')
del data[player]
data.save()
server.save_config_simple(data, 'data.json')


def on_player_joined(server, player, info):
Expand Down
31 changes: 0 additions & 31 deletions gamemode/gamemode/json.py

This file was deleted.

7 changes: 5 additions & 2 deletions gamemode/mcdreforged.plugin.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
{
"id": "gamemode",
"version": "0.0.3",
"version": "0.1.0",
"name": "Gamemode",
"description": {
"en_us": "Change to spectator mode for observe, teleport to origin position when change back to survival mode",
"zh_cn": "旁观者模式以旁观,返回生存时传送回原坐标"
},
"author": "Andy Zhang",
"link": "https://github.com/AnzhiZhang/MCDReforgedPlugins/tree/master/gamemode"
"link": "https://github.com/AnzhiZhang/MCDReforgedPlugins/tree/master/gamemode",
"dependencies": {
"minecraft_data_api": ">=1.4.1"
}
}

0 comments on commit d999f4a

Please sign in to comment.