sudo apt install dirmngr ca-certificates gnupg
sudo gpg --homedir /tmp --no-default-keyring --keyring /usr/share/keyrings/mono-official-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb [signed-by=/usr/share/keyrings/mono-official-archive-keyring.gpg] https://download.mono-project.com/repo/debian stable-buster main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
sudo apt update

sudo apt install mono-devel mono-complete mono-dbg referenceassemblies-pcl ca-certificates-mono mono-xsp4

作者: reistlin
来源: http://www.reistlin.com/blog/470
更新时间: 2024.06
版权声明: 原创文章.转载请保留作者信息和原文完整.谢绝任何方式的摘要

runuo_logo .png

一,下载:

RunUO 2.0 下载:
https://github.com/runuo/runuo/tree/releases/2.0

Neruns Distro 5.2.1a 下载:
https://github.com/nerun/runuo-nerun-distro/releases/tag/Old-521a

ClassicUO 下载:
https://github.com/ClassicUO/ClassicUO

Ultima Online Mondains Legacy 蒙丹遗产:
Client Patch 5.0.9.1

二,安装:

1)解压缩 RunUO-2.0 和 NerunsDistro.v5.2.1a

2)将 NerunsDistro.v5.2.1a 文件夹下的 DataScripts 两个文件夹 复制(覆盖) 到 RunUO-2.0

3)复制 zlib32.dllzlib64.dll 文件到 RunUO-2.0

4)进入 RunUO-2.0,新建 Build.bat 文件:

@echo off
 
chcp 65001
echo.
 
echo ================ 删除 RunUO.exe ================
echo.
del /s /q /s "%~dp0RunUO.exe"
echo.
 
timeout /t 1
 
echo.
echo ================ 编译 RunUO.exe ================
echo.
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc /optimize /unsafe /t:exe /out:RunUO.exe /win32icon:Server\runuo.ico /d:NEWTIMERS /d:NEWPARENT /recurse:Server\*.cs
echo 编译完成...
 
timeout /t 5

5)运行 Build.bat 文件。完成 .NET 编译,生成 RunUO.exe 文件。

runuo_build.png

三,配置:

1)设置 UO 服务器名称
编辑文件:Scripts\Misc\ServerList.cs

public static readonly string ServerName = "RunUO TC";
为:
public static readonly string ServerName = "REISTLIN";

2)设置 UO 服务器客户端(蒙丹遗产 UOML v5.0.9.1)路径
编辑文件:Scripts\Misc\DataPath.cs

private static string CustomPath = null;
为:
private static string CustomPath = @"D:\Games\Ultima Online ML (5.0.9.1)";

3)设置 UO 服务器支持客户端版本(Client Patch < v6.0.0.0
编辑文件:Scripts\Misc\MapDefinitions.cs

RegisterMap( 1, 1, 1, 7168, 4096, 0, "Trammel",		MapRules.TrammelRules );
为:
RegisterMap( 1, 1, 0, 7168, 4096, 0, "Trammel",		MapRules.TrammelRules );
以及:
TileMatrixPatch.Enabled = false;
为:
TileMatrixPatch.Enabled = true;

四,启动:

1)运行 RunUO.exe

runuo_init.png

2)设置 ClassicUO Launcher 客户端登录

runuo_login.png

3)登录游戏,点击界面或者输入命令:

[PremiumSpawner

启动 Premium Spawner Engine 世界初始化界面,根据需要自动生成各个地图物品、NPC。

runuo_admin.png

4)RunUO GM 命令https://runuo.github.io/runuo/docs/commands.html

五,UO 中文配置:

1)UO 客户端配置文件:Uo.cfg

UserLanguageCodeString=CHT

2)ClassicUO Launcher 配置文件:ClassicUO Launcher\ClassicUO\settings.json

"lang": "CHT",

2012年

2011年

2010年

2009年

2008年

2007年

2006年

2005年

2004年

2003年

2002年

2001年

2000年

1999年

1998年

1997年

采编: reistlin
来源: Internet 互联网
更新时间: 2024.04
版权声明: <<了解这个世界>>系列文章.转载请保留作者信息和原文完整.

knowledge.gif

mandelbrot_sequence.gif

曼德博集合(英语:Mandelbrot Set,或译为曼德布洛特复数集合)是一种在复平面上组成分形的点的集合,以数学家本华·曼德博的名字命名。曼德博集合与朱利亚集合有些相似的地方,例如使用相同的复二次多项式来进行迭代。

Mandel_zoom_00_mandelbrot_set.jpg

- 阅读剩余部分 -

作者: reistlin
来源: http://www.reistlin.com/blog/444
更新时间: 2024.04
版权声明: 原创文章.转载请保留作者信息和原文完整.谢绝任何方式的摘要

UO Outlands [https://uooutlands.com]
UO Razor Assistant [https://www.razorce.com]

一,关闭 UO 客户端,编辑 default.xml 文件

游戏目录\ClassicUO\Data\Plugins\Assistant\Profiles\default.xml

二,替换 XML 标签 overheadmessages 之间的内容

<overheadmessages>
	<overheadmessage searchtext="The world will save in 15 seconds" message="* 服务器准备保存 *" hue="53" />
	<overheadmessage searchtext="The world is saving, please wait" message="* 服务器正在保存 *" hue="38" />
	<overheadmessage searchtext="World save complete" message="* 服务器保存完成 *" hue="68" />
	<overheadmessage searchtext="Captcha successful" message="* 验证成功 *" hue="68" />
	<overheadmessage searchtext="You are now under the protection of the town guards" message="* 进入城镇(安全) *" hue="68" />
	<overheadmessage searchtext="You have left the protection of the town guards" message="* 离开城镇(危险) *" hue="53" />
	<overheadmessage searchtext="You enter the rental room" message="* 进入房间(租用) *" hue="68" />
	<overheadmessage searchtext="You exit the rental room" message="* 离开房间(租用) *" hue="53" />
	<overheadmessage searchtext="You begin applying the bandages" message="* 开始绷带 *" hue="88" />
	<overheadmessage searchtext="You finish applying the bandages" message="* 绷带完成 *" hue="68" />
	<overheadmessage searchtext="You begin using veterinary supplies" message="* 开始绷带(宠物) *" hue="88" />
	<overheadmessage searchtext="You finish using veterinary supplies" message="* 绷带完成(宠物) *" hue="68" />
	<overheadmessage searchtext="You are able to resurrect your follower" message="* 绷带复活(宠物) *" hue="68" />
	<overheadmessage searchtext="You fail to resurrect one or more of your followers" message="* 绷带复活(失败) *" hue="38" />
	<overheadmessage searchtext="Passive taming skill gain available" message="* 获得技能(驯兽) *" hue="68" />
	<overheadmessage searchtext="You enter a meditative trance" message="* 开始冥想 *" hue="68" />
	<overheadmessage searchtext="You stop meditating" message="* 停止冥想 *" hue="68" />
	<overheadmessage searchtext="You cannot focus your concentration" message="* 冥想失败 *" hue="53" />
	<overheadmessage searchtext="You are currently prevented from" message="* 禁止拾取 *" hue="53" />
	<overheadmessage searchtext="Magical travel is not allowed in this location" message="* 禁止传送 *" hue="53" />
	<overheadmessage searchtext="You are too fatigued to move" message="* 已超重 *" hue="38" />
	<overheadmessage searchtext="You charge your spell with additional energy" message="* 法术充能 *" hue="88" />
	<overheadmessage searchtext="You absorb their spell" message="* 法术吸收 *" hue="88" />
	<overheadmessage searchtext="You parry the spell" message="* 法术格挡 *" hue="88" />
	<overheadmessage searchtext="Being perfectly rested, you shove them out of the way" message="* 推开 *" hue="88" />
	<overheadmessage searchtext="Your attack causes your target to bleed" message="* 流血 *" hue="88" />
	<overheadmessage searchtext="You smash through the remainder" message="* 破甲 *" hue="88" />
	<overheadmessage searchtext="Your shot hinders your target" message="* 定身 *" hue="88" />
	<overheadmessage searchtext="Your lightning spell hinders your target" message="* 定身(闪电) *" hue="88" />
	<overheadmessage searchtext="You cause your target to bleed out" message="* 终结技(BleedOut) *" hue="88" />
	<overheadmessage searchtext="You execute your target" message="* 终结技(Execute) *" hue="88" />
	<overheadmessage searchtext="Crafting queue begun" message="* 开始制造(队列) *" hue="68" />
	<overheadmessage searchtext="Crafting queue stopped" message="* 停止制造(队列) *" hue="53" />
	<overheadmessage searchtext="Crafting queue complete" message="* 制造完成(队列) *" hue="68" />
	<overheadmessage searchtext="You create the item" message="* 制造成功 *" hue="68" />
	<overheadmessage searchtext="You create an exceptional quality item" message="* 制造成功(卓越) *" hue="68" />
	<overheadmessage searchtext="You failed to create the item" message="* 制造失败 *" hue="53" />
	<overheadmessage searchtext="You pour the potion into a bottle" message="* 制造成功 *" hue="68" />
	<overheadmessage searchtext="You fail to create a useful potion" message="* 制造失败 *" hue="53" />
	<overheadmessage searchtext="You don''t have the resources required to make that item" message="* 缺少制造材料 *" hue="53" />
	<overheadmessage searchtext="You have worn out your tool" message="* 工具损坏 *" hue="38" />
	<overheadmessage searchtext="Target an individual item to recycle" message="* 选择物品(回收) *" hue="53" />
	<overheadmessage searchtext="You successfully steal the item" message="* 偷窃成功 *" hue="68" />
	<overheadmessage searchtext="You fail in your stealing attempt" message="* 偷窃失败 *" hue="38" />
	<overheadmessage searchtext="Now tracking" message="* 目标 {3} *" hue="38" />
	<overheadmessage searchtext="Distance to destination" message="* 目标距离 {4} *" hue="38" />
	<overheadmessage searchtext="You cannot cast a spell while frozen" message="* 无法施法 *" hue="38" />
	<overheadmessage searchtext="You cannot move" message="* 无法移动 *" hue="38" />
	<overheadmessage searchtext="You must wait another" message="* 冷却 {5} 秒 *" hue="53" />
	<overheadmessage searchtext="Target cannot be seen" message="* 目标不在视野 *" hue="53" />
	<overheadmessage searchtext="You cannot see that from here" message="* 目标不在视野 *" hue="53" />
	<overheadmessage searchtext="That is too far away" message="* 距离太远 *" hue="53" />
	<overheadmessage searchtext="That vendor is too far away from you" message="* 距离太远(商人) *" hue="53" />
	<overheadmessage searchtext="You are too far away to use that" message="* 距离太远(物品) *" hue="53" />
	<overheadmessage searchtext="Target is too far away." message="* 距离太远(目标) *" hue="53" />
	<overheadmessage searchtext="You or your nearby followers do not require healing" message="* 距离太远(宠物) *" hue="53" />
	<overheadmessage searchtext="You do not have enough holy symbols for that ability" message="* 神圣符文不足 *" hue="53" />
	<overheadmessage searchtext="You consume a magic mushroom and restore some mana" message="* 魔法蘑菇(已使用) *" hue="68" />
	<overheadmessage searchtext="You may now use another magic mushroom" message="* 魔法蘑菇(已冷却) *" hue="88" />
	<overheadmessage searchtext="You have been in combat" message="* 战斗状态中 *" hue="53" />
	<overheadmessage searchtext="That spell will not adhere to you at this time" message="* 法术冷却中 *" hue="53" />
	<overheadmessage searchtext="You are already casting a spell" message="* 施法进行中 *" hue="53" />
	<overheadmessage searchtext="You have not yet recovered from casting a spell" message="* 施法恢复中 *" hue="53" />
	<overheadmessage searchtext="Your concentration is disturbed, thus ruining thy spell" message="* 施法被干扰 *" hue="38" />
	<overheadmessage searchtext="You must wait to perform another action" message="* 等待动作完成 *" hue="53" />
	<overheadmessage searchtext="You must wait a few moments to use another skill" message="* 等待技能完成 *" hue="53" />
	<overheadmessage searchtext="You must wait a few moments before you may use this item again" message="* 等待物品完成 *" hue="53" />
	<overheadmessage searchtext="You must wait another moment before you may pick up an item from here" message="* 等待拾取物品 *" hue="53" />
	<overheadmessage searchtext="The recipient of this trade would not be able to carry this" message="* 对方无法接收 *" hue="53" />
	<overheadmessage searchtext="There are no charges left on that item" message="* 剩余次数用完 *" hue="53" />
	<overheadmessage searchtext="You do not have that spell" message="* 没有这个法术 *" hue="53" />
	<overheadmessage searchtext="You must be near an anvil and a forge to smith items" message="* 没有锻炉铁砧 *" hue="53" />
	<overheadmessage searchtext="You place the gathered wool into your backpack" message="* 收集羊毛 *" hue="88" />
	<overheadmessage searchtext="You begin to move quietly" message="* 开始潜行 *" hue="88" />
	<overheadmessage searchtext="You feel comfortable enough to begin stealthing	" message="* 开始潜行 *" hue="88" />
	<overheadmessage searchtext="You feel ready to continue stealthing" message="* 继续潜行 *" hue="88" />
	<overheadmessage searchtext="You will automatically stealth when out of steps" message="* 继续潜行 *" hue="88" />
	<overheadmessage searchtext="Lock what down" message="* 锁定(Lock) *" hue="68" />
	<overheadmessage searchtext="Choose the item you wish to secure" message="* 保护(Secure) *" hue="68" />
	<overheadmessage searchtext="Choose the item you wish to release" message="* 解锁(Release) *" hue="38" />
	<overheadmessage searchtext="You cannot pick that up" message="* 无法拾取物品 *" hue="53" />
</overheadmessages>

三,启动游戏,Razor > General > Profiles 选择 default。

Outlands.jpg

作者: reistlin
来源: http://www.reistlin.com/blog/447
更新时间: 2024.03
版权声明: 原创文章.转载请保留作者信息和原文完整.谢绝任何方式的摘要

azerothcore.gif

AzerothCore 主页:https://www.azerothcore.org
AzerothCore Wiki 文档:https://www.azerothcore.org/wiki/home

一,使用 screen 启动 worldserver

1、安装 screen:

apt-get install screen

2、使用 screen 启动 worldserver,窗口名称为:worldserver

cd /home/reistlin/azerothcore/bin
screen -S worldserver
./worldserver

3、退出当前 screen 窗口

Ctrl + a键 d键

4、查看 screen 窗口状态

reistlin@Debian:~/azerothcore/bin$ screen -ls
There is a screen on:
        112233.worldserver      (03/20/2024 10:00:00 AM)        (Attached)
1 Socket in /run/screen/S-reistlin.

二,使用 restart.sh 重启 AzerothCore

acore_screen:screen 窗口名称(默认:worldserver)
acore_path:AzerothCore 系统根目录(默认:/home/reistlin/azerothcore)
acore_delay:服务器计划重启时间,默认 60 秒后重启,同时通知所有在线玩家
app_user:运行 worldserver 的用户名称

#!/bin/bash
 
# name: restart AzerothCore by screen v0.1 (Linux Server)
# author: reistlin
# website: www.reistlin.com
# date: 2024.03.20
 
acore_screen="worldserver"
acore_path="/home/reistlin/azerothcore"
acore_delay="60"
 
app_user="reistlin"
app_process="SCREEN -S ${acore_screen}"
app_port="8085"
 
check1=`ps v -U ${app_user} | grep "${app_process}" | grep -v "grep" | wc -l`
check2=`netstat -nlpt | grep ":${app_port}" | wc -l`
 
if [ "${check1}" -eq 1 ] && [ "${check2}" -eq 1 ]; then
	# save
	screen -x -S ${acore_screen} -p 0 -X stuff "save\n"          
	sleep 1
 
	# shutdown
	screen -x -S ${acore_screen} -p 0 -X stuff "server shutdown ${acore_delay}\n"
	sleep `expr ${acore_delay} + 3`
 
	# start
	screen -x -S ${acore_screen} -p 0 -X stuff "${acore_path}/bin/worldserver\n"
	sleep 1
 
	# logfile
	echo "[`date "+%Y-%m-%d %H:%M:%S"`] ${acore_screen} service has successfully restarted" >> $HOME/crontab/restart.log
else
	echo "[EXIT] Not found worldserver by screen"
fi

编辑 crontab,设置每天凌晨 6 点自动重启

# restart AzerothCore worldserver
0  6 * * * /home/reistlin/crontab/restart.sh > /dev/null 2>&1

[https://github.com/shadowsocks/shadowsocks/wiki/Optimizing-Shadowsocks]

/etc/sysctl.d/local.conf

# max open files
fs.file-max = 51200
# max read buffer
net.core.rmem_max = 67108864
# max write buffer
net.core.wmem_max = 67108864
# default read buffer
net.core.rmem_default = 65536
# default write buffer
net.core.wmem_default = 65536
# max processor input queue
net.core.netdev_max_backlog = 4096
# max backlog
net.core.somaxconn = 4096
 
# resist SYN flood attacks
net.ipv4.tcp_syncookies = 1
# reuse timewait sockets when safe
net.ipv4.tcp_tw_reuse = 1
# turn off fast timewait sockets recycling
net.ipv4.tcp_tw_recycle = 0
# short FIN timeout
net.ipv4.tcp_fin_timeout = 30
# short keepalive time
net.ipv4.tcp_keepalive_time = 1200
# outbound port range
net.ipv4.ip_local_port_range = 10000 65000
# max SYN backlog
net.ipv4.tcp_max_syn_backlog = 4096
# max timewait sockets held by system simultaneously
net.ipv4.tcp_max_tw_buckets = 5000
# turn on TCP Fast Open on both client and server side
net.ipv4.tcp_fastopen = 3
# TCP receive buffer
net.ipv4.tcp_rmem = 4096 87380 67108864
# TCP write buffer
net.ipv4.tcp_wmem = 4096 65536 67108864
# turn on path MTU discovery
net.ipv4.tcp_mtu_probing = 1
 
# for high-latency network
net.ipv4.tcp_congestion_control = hybla
 
# for low-latency network, use cubic instead
# net.ipv4.tcp_congestion_control = cubic

sysctl --system

作者: reistlin
来源: http://www.reistlin.com/blog/444
更新时间: 2024.01
版权声明: 原创文章.转载请保留作者信息和原文完整.谢绝任何方式的摘要

UO Outlands [https://uooutlands.com]
UO Razor Assistant [https://www.razorce.com]

# Auto Lumberjacking v1.2
# By REISTLIN
 
# Auto Recall ON/OFF
@setvar! AutoRecall 1
 
// Disparalyze
if paralyzed
    if findtype "pouch" backpack
        yell "[pouch"
    else
        overhead "* 没有 Trapped Pouch *" 38     
    endif
endif
 
// Auto Recall
if AutoRecall = 1
    if insysmsg "Distance to destination" or insysmsg "Now tracking"
        // Cancel Target
        if targetexists
            hotkey "Clear Target Queue"
            hotkey "Cancel Current Target"
        endif
 
        // Interrupt Current Action
        hotkey "> Interrupt"
 
        // Rune Book
        if findtype "runebook" backpack
            overhead "* 开始传送 *" 88
            dclicktype "runebook"
            waitforgump 1551740969
            gumpresponse 2
            stop
        endif
 
        // Outlands Requirement
        if findtype "Recall rune" backpack
            if skill "Magery" >= 40
                // Recall Scroll
                if findtype "Recall" backpack
                    overhead "* 开始传送(卷轴) *" 88
                    dclicktype "Recall"
                    waitfortarget
                    targettype "Recall rune"
                    stop                
                endif
                // Spell Book
                if findtype "Spellbook" backpack and findtype "Black Pearl%s%" backpack and findtype "Blood Moss" backpack and findtype "Mandrake Root%s%" backpack
                    overhead "* 开始传送(魔法) *" 88
                    cast "Recall"
                    waitfortarget
                    targettype "Recall rune"
                    stop
                endif
            else
                overhead "* 魔法技能不够 *" 38
            endif
        else
            overhead "* 没有传送符文 *" 53    
        endif
    endif
endif
 
// Check Tracking Buff
if not findbuff "tracking"
    skill "tracking"
    waitforgump 4267467659 
    gumpresponse 6
    wait 1000
    gumpclose 4267467659
    overhead "* 追踪中 *"
endif
 
// Check Left Hand
if lhandempty
    if findtype "hatchet" backpack
        dclicktype "hatchet" backpack
        wait 500
    else
        overhead "* 没有伐木工具 *" 38
        break
    endif
endif
 
// Check Over Weight
if weight > maxweight
    overhead "* 已超重 *" 38
else
    dclick "hands"
    waitfortarget 500
    target "self"
endif
 
// Report Status
if insysmsg "You chop some"
    overhead "* 伐木中 *" 88
elseif insysmsg "You broke your axe"
    overhead "* 伐木工具损坏 *" 38
elseif insysmsg "You do not see any harvestable resources nearby" or insysmsg "You cannot produce any wood from that"
    overhead "* 没有伐木资源 *" 53
elseif insysmsg "Harvesting is not allowed in this area"
    overhead "* 禁止伐木区域 *" 53
endif
 
wait 2000
 
loop

作者: reistlin
来源: http://www.reistlin.com/blog/443
更新时间: 2024.01
版权声明: 原创文章.转载请保留作者信息和原文完整.谢绝任何方式的摘要

UO Outlands [https://uooutlands.com]
UO Razor Assistant [https://www.razorce.com]

# Auto Mining v1.2
# By REISTLIN
 
# Auto Recall ON/OFF
@setvar! AutoRecall 1
 
// Disparalyze
if paralyzed
    if findtype "pouch" backpack
        yell "[pouch"
    else
        overhead "* 没有 Trapped Pouch *" 38    
    endif
endif
 
// Auto Recall
if AutoRecall = 1
    if insysmsg "Distance to destination" or insysmsg "Now tracking"
        // Cancel Target
        if targetexists
            hotkey "Clear Target Queue"
            hotkey "Cancel Current Target"
        endif
 
        // Interrupt Current Action
        hotkey "> Interrupt"
 
        // Rune Book
        if findtype "runebook" backpack
            overhead "* 开始传送 *" 88
            dclicktype "runebook"
            waitforgump 1551740969
            gumpresponse 2
            stop
        endif
 
        // Outlands Requirement
        if findtype "Recall rune" backpack
            if skill "Magery" >= 40
                // Recall Scroll
                if findtype "Recall" backpack
                    overhead "* 开始传送(卷轴) *" 88
                    dclicktype "Recall"
                    waitfortarget
                    targettype "Recall rune"
                    stop                
                endif
                // Spell Book
                if findtype "Spellbook" backpack and findtype "Black Pearl%s%" backpack and findtype "Blood Moss" backpack and findtype "Mandrake Root%s%" backpack
                    overhead "* 开始传送(魔法) *" 88
                    cast "Recall"
                    waitfortarget
                    targettype "Recall rune"
                    stop
                endif
            else
                overhead "* 魔法技能不够 *" 38
            endif
        else
            overhead "* 没有传送符文 *" 53    
        endif
    endif
endif
 
// Check Tracking Buff
if not findbuff "tracking"
    skill "tracking"
    waitforgump 4267467659 
    gumpresponse 6
    wait 1000
    gumpclose 4267467659
    overhead "* 追踪中 *" 
endif
 
// Check Right Hand
if rhandempty
    if findtype "pickaxe" backpack
        dclicktype "pickaxe" backpack
        wait 500
    else
        overhead "* 没有采矿工具 *" 38 
        break
    endif
endif
 
// Check Over Weight
if weight > maxweight
    overhead "* 已超重 *" 38
else
    dclick "hands"
endif
 
// Report Status
if insysmsg "You dig some"
    overhead "* 采矿中 *" 88
elseif insysmsg "You have worn out your tool"
    overhead "* 采矿工具损坏 *" 38
elseif insysmsg "You do not see any harvestable resources nearby"
    overhead "* 没有采矿资源 *" 53
elseif insysmsg "Harvesting is not allowed in this area"
    overhead "* 禁止采矿区域 *" 53
endif
 
wait 2000
 
loop