Project1
标题:
今天论坛很无聊
[打印本页]
作者:
link006007
时间:
2008-6-7 06:59
标题:
今天论坛很无聊
这个写在最前面:
全部VIP寻找 C\C++达人, 了解ruby与C\C++之间调用的人.
我只问一个问题!!
高手或有意者请PM我, 若能解决 全额VIP奉上!!
一下是正文: = =b
rt
正好论坛上有很多人在做鼠标脚本
所以把我游戏里的那个DX Input提出来编译成dll了
让RM调用, 因为RM不能require dll, 所以只能用Win32API
效果上不是很好{/gg}
好歹RM那些代码也发了我2小时, 索性就贴出来了 = =b
PS 以前夏娜也有写过一个, 不过可惜未给出dll的代码
现在我把我的给出来, 其实就是以前的工程那个类直接提取出来,
去掉一些东西, 添了几个导出函数编译成的,由于写的仓促
还有很多补足... ...
orz 我发的dll是Debug版本的, 应该没有人可以用吧
带有src的(下面连接)
先咔嚓掉 完整了再说
就几KB - -
使用方法
main前添加
$: << File.expand_path(File.dirname(__FILE__))
require 'RbKK.rb'
然后在适当的地方 Init, Update, Release...
main 大概这样
$: << File.expand_path(File.dirname(__FILE__))
require 'RbKK.rb'
begin
RM_Input.InitDXInput()
Font.default_name = (["黑体"])
Graphics.freeze
$scene = Scene_Title.new
while $scene != nil
$scene.main
end
Graphics.transition(20)
RM_Input.Release()
rescue Errno::ENOENT
filename = $!.message.sub("No such file or directory - ", "")
print("找不到文件 #{filename}。 ")
end
复制代码
然后在Scene的main的loop块中可以替换掉Input.update, 也可以在其上下
RM_Input.Update(), 具体其他函数可以看RbKK里面
这个什么功能都没有, 就是读取鼠标键盘{/gg}
全键盘的调用, 鼠标移动(包括计算DX3D的鼠标X,Y,Z偏移),
没有那些trigger? 之类的功能判断, 可能以后会添加吧.
等到这些功能好了以后, 应该可以不要使用默认的Input了
最后, 如有360之类的会报告什么 发现一个进程注册键盘 什么的,请放心..
作者:
禾西
时间:
2008-6-7 07:27
trigger? 之類的判斷禾西手上有一個不錯的。整理一下扔出來吧==
作者:
link006007
时间:
2008-6-7 07:46
以下引用
禾西于2008-6-6 23:27:41
的发言:
trigger? 之類的判斷禾西手上有一個不錯的。整理一下扔出來吧==
那就扔出来吧 我也可以看看,
省得自己用nc的脑袋去想出那些nc的方法
作者:
禾西
时间:
2008-6-7 08:01
禁止四方嚮鍵盤使用:
Input.dir4forbid
擊鍵測試:
Input.click?(key)
Input.testkey(key)
模擬按下:
Input.push(key)
取消按下
Input.delete(key)
擊鍵判斷:
Input.triggerd?(key)
壓健判斷:
Input.pressed?(key)
四方嚮:
Input.dir4
任意鍵按下:
Input.Anykey
module Input
#--------------------------------------------------------------------------
# * Variable Setup
#--------------------------------------------------------------------------
@keys = []
@pressed = []
Mouse_Left = 1
Mouse_Right = 2
Mouse_Middle = 4
Back= 8
Tab = 9
Enter = 13
Shift = 16
Ctrl = 17
Alt = 18
Esc = 0x1B
LT = 0x25
UPs = 0x26
RT = 0x27
DN = 0x28
Space = 32
Numberkeys = {}
Numberkeys[0] = 48 # => 0
Numberkeys[1] = 49 # => 1
Numberkeys[2] = 50 # => 2
Numberkeys[3] = 51 # => 3
Numberkeys[4] = 52 # => 4
Numberkeys[5] = 53 # => 5
Numberkeys[6] = 54 # => 6
Numberkeys[7] = 55 # => 7
Numberkeys[8] = 56 # => 8
Numberkeys[9] = 57 # => 9
Numberpad = {}
Numberpad[0] = 45
Numberpad[1] = 35
Numberpad[2] = 40
Numberpad[3] = 34
Numberpad[4] = 37
Numberpad[5] = 12
Numberpad[6] = 39
Numberpad[7] = 36
Numberpad[8] = 38
Numberpad[9] = 33
Letters = {}
Letters["A"] = 65
Letters["B"] = 66
Letters["C"] = 67
Letters["D"] = 68
Letters["E"] = 69
Letters["F"] = 70
Letters["G"] = 71
Letters["H"] = 72
Letters["I"] = 73
Letters["J"] = 74
Letters["K"] = 75
Letters["L"] = 76
Letters["M"] = 77
Letters["N"] = 78
Letters["O"] = 79
Letters["P"] = 80
Letters["Q"] = 81
Letters["R"] = 82
Letters["S"] = 83
Letters["T"] = 84
Letters["U"] = 85
Letters["V"] = 86
Letters["W"] = 87
Letters["X"] = 88
Letters["Y"] = 89
Letters["Z"] = 90
Equ={} # Shift Value for num US
Equ[0]=')' # FR: à
Equ[1]='!' # FR: &
Equ[2]='@' # FR: é
Equ[3]='#' # FR: "
Equ[4]='$' # FR: '
Equ[5]='%' # FR: (
Equ[6]='^' # FR: -
Equ[7]='&' # FR: è
Equ[8]='*' # FR: _
Equ[9]='(' # FR: ç
Carac = {}
Carac[0] = 48 # => 0
Carac[1] = 49 # => 1
Carac[2] = 50 # => 2
Carac[3] = 51 # => 3
Carac[4] = 52 # => 4
Carac[5] = 53 # => 5
Carac[6] = 54 # => 6
Carac[7] = 55 # => 7
Carac[8] = 56 # => 8
Carac[9] = 57 # => 9
Carac["A"] = 65
Carac["B"] = 66
Carac["C"] = 67
Carac["D"] = 68
Carac["E"] = 69
Carac["F"] = 70
Carac["G"] = 71
Carac["H"] = 72
Carac["I"] = 73
Carac["J"] = 74
Carac["K"] = 75
Carac["L"] = 76
Carac["M"] = 77
Carac["N"] = 78
Carac["O"] = 79
Carac["P"] = 80
Carac["Q"] = 81
Carac["R"] = 82
Carac["S"] = 83
Carac["T"] = 84
Carac["U"] = 85
Carac["V"] = 86
Carac["W"] = 87
Carac["X"] = 88
Carac["Y"] = 89
Carac["Z"] = 90
Fkeys = {}
Fkeys[1] = 112
Fkeys[2] = 113
Fkeys[3] = 114
Fkeys[4] = 115
Fkeys[5] = 116
Fkeys[6] = 117
Fkeys[7] = 118
Fkeys[8] = 119
Fkeys[9] = 120
Fkeys[10] = 121
Fkeys[11] = 122
Fkeys[12] = 123
Collon = 186 # => \ |
Equal = 187 # => = +
Comma = 188 # => , <
Underscore = 189 # => - _
Dot = 190 # => . >
Backslash = 191 # => / ?
Lb = 219
Rb = 221
Quote = 222 # => '"
Lb = 219 # US: [{ FR: )°
Rb = 221 # US: ]} FR: ^¨
E2 = 226 # FR: <>
DC = 220 # US: \| FR: *µ
DF = 223 # FR: !§
C0 = 192 # US: `~ FR: ù%
#--------------------------------------------------------------------------
# * Win32API Call
#--------------------------------------------------------------------------
State = Win32API.new('user32','GetKeyState',['i'],'i')
Key = Win32API.new('user32','GetAsyncKeyState',['i'],'i')
#-------------------------------------------------------------------------------
USED_KEYS = [Mouse_Left, Mouse_Right, Mouse_Middle]
#-------------------------------------------------------------------------------
module_function
#--------------------------------------------------------------------------
def Input.dir4forbid=(val)
@dir4=val
end
#--------------------------------------------------------------------------
def Input.click?(key)
Key.call(key) & 0x01 != 0
end
#--------------------------------------------------------------------------
def Input.getstate(key)
return true unless State.call(key).between?(0, 1)
return false
end
#--------------------------------------------------------------------------
def Input.testkey(key)
Key.call(key) & 0x01 != 0
end
#--------------------------------------------------------------------------
def Input.push(key)
@keys.push(key)
end
#--------------------------------------------------------------------------
def Input.delete(key)
@keys.delete(key)
end
#--------------------------------------------------------------------------
# Input 的更新,擊鍵的截取
#--------------------------------------------------------------------------
def Input.update
@keys = []
@keys.push(Input::Mouse_Left) if Input.testkey(Input::Mouse_Left)
@keys.push(Input::Mouse_Right) if Input.testkey(Input::Mouse_Right)
@keys.push(Input::Back) if Input.testkey(Input::Back)
@keys.push(Input::Tab) if Input.testkey(Input::Tab)
@keys.push(Input::Enter) if Input.testkey(Input::Enter)
@keys.push(Input::Shift) if Input.testkey(Input::Shift)
@keys.push(Input::Ctrl) if Input.testkey(Input::Ctrl)
@keys.push(Input::Alt) if Input.testkey(Input::Alt)
@keys.push(Input::Esc) if Input.testkey(Input::Esc)
for key in Input::Letters.values
@keys.push(key) if Input.testkey(key)
end
for key in Input::Numberkeys.values
@keys.push(key) if Input.testkey(key)
end
for key in Input::Numberpad.values
@keys.push(key) if Input.testkey(key)
end
for key in Input::Fkeys.values
@keys.push(key) if Input.testkey(key)
end
@keys.push(Input::Collon) if Input.testkey(Input::Collon)
@keys.push(Input::Equal) if Input.testkey(Input::Equal)
@keys.push(Input::Comma) if Input.testkey(Input::Comma)
@keys.push(Input::Underscore) if Input.testkey(Input::Underscore)
@keys.push(Input::Dot) if Input.testkey(Input::Dot)
@keys.push(Input::Backslash) if Input.testkey(Input::Backslash)
@keys.push(Input::Lb) if Input.testkey(Input::Lb)
@keys.push(Input::Rb) if Input.testkey(Input::Rb)
@keys.push(Input::Quote) if Input.testkey(Input::Quote)
@keys.push(Input::Space) if Input.testkey(Input::Space)
@keys.push(Input::LT) if Input.testkey(Input::LT)
@keys.push(Input::UPs) if Input.testkey(Input::UPs)
@keys.push(Input::RT) if Input.testkey(Input::RT)
@keys.push(Input::DN) if Input.testkey(Input::DN)
@pressed = []
@pressed.push(Input::Space) if Input.getstate(Input::Space)
@pressed.push(Input::Mouse_Left) if Input.getstate(Input::Mouse_Left)
@pressed.push(Input::Mouse_Right) if Input.getstate(Input::Mouse_Right)
@pressed.push(Input::Back) if Input.getstate(Input::Back)
@pressed.push(Input::Tab) if Input.getstate(Input::Tab)
@pressed.push(Input::Enter) if Input.getstate(Input::Enter)
@pressed.push(Input::Shift) if Input.getstate(Input::Shift)
@pressed.push(Input::Ctrl) if Input.getstate(Input::Ctrl)
@pressed.push(Input::Alt) if Input.getstate(Input::Alt)
@pressed.push(Input::Esc) if Input.getstate(Input::Esc)
@pressed.push(Input::LT) if Input.getstate(Input::LT)
@pressed.push(Input::UPs) if Input.getstate(Input::UPs)
@pressed.push(Input::RT) if Input.getstate(Input::RT)
@pressed.push(Input::DN) if Input.getstate(Input::DN)
for key in Input::Numberkeys.values
@pressed.push(key) if Input.getstate(key)
end
for key in Input::Numberpad.values
@pressed.push(key) if Input.getstate(key)
end
for key in Input::Letters.values
@pressed.push(key) if Input.getstate(key)
end
for key in Input::Fkeys.values
@pressed.push(key) if Input.getstate(key)
end
@pressed.push(Input::Collon) if Input.getstate(Input::Collon)
@pressed.push(Input::Equal) if Input.getstate(Input::Equal)
@pressed.push(Input::Comma) if Input.getstate(Input::Comma)
@pressed.push(Input::Underscore) if Input.getstate(Input::Underscore)
@pressed.push(Input::Dot) if Input.getstate(Input::Dot)
@pressed.push(Input::Backslash) if Input.getstate(Input::Backslash)
@pressed.push(Input::Lb) if Input.getstate(Input::Lb)
@pressed.push(Input::Rb) if Input.getstate(Input::Rb)
@pressed.push(Input::Quote) if Input.getstate(Input::Quote)
end
#--------------------------------------------------------------------------
def Input.triggerd?(key)
#--------------------------------------------------------------------------
if @dir4
case key
when Input::DOWN, Input::DN
@keys.delete(Input::DOWN)
@keys.delete(Input::DN)
when Input::UP, Input::UPs
@keys.delete(Input::UP)
@keys.delete(Input::UPs)
when Input::LEFT,Input::LT
@keys.delete(Input::LEFT)
@keys.delete(Input::LT)
when Input::RIGHT,Input::RT
@keys.delete(Input::RIGHT)
@keys.delete(Input::RT)
end
end
#--------------------------------------------------------------------------
return true if @keys.include?(key)
return false
end
#--------------------------------------------------------------------------
def Input.pressed?(key)
return true if @pressed.include?(key)
return false
end
#--------------------------------------------------------------------------
# * 4 Diraction
#--------------------------------------------------------------------------
def Input.dir4
return 2 if Input.pressed?(Input::DN)
return 4 if Input.pressed?(Input::LT)
return 6 if Input.pressed?(Input::RT)
return 8 if Input.pressed?(Input::UPs)
end
#--------------------------------------------------------------------------
# * Trigger (key)
#--------------------------------------------------------------------------
def trigger?(key)
keys = []
case key
when Input::DOWN
keys.push(Input::DN)
when Input::UP
keys.push(Input::UPs)
when Input::LEFT
keys.push(Input::LT)
when Input::RIGHT
keys.push(Input::RT)
when Input::C
keys.push(Input::Enter)
keys.push(Input::Space)
when Input::B
keys.push(Input::Esc)
keys.push(Input::Mouse_Right)
when Input::X
keys.push(Input::Letters["A"])
when Input::L
keys.push(Input::Letters["Q"])
when Input::R
keys.push(Input::Letters["W"])
when Input::Y
keys.push(Input::Letters["R"])
when Input::F5
keys.push(Input::Fkeys[5])
when Input::F6
keys.push(Input::Fkeys[6])
when Input::F7
keys.push(Input::Fkeys[7])
when Input::F8
keys.push(Input::Fkeys[8])
when Input::F9
keys.push(Input::Fkeys[9])
when Input::SHIFT
keys.push(Input::Shift)
when Input::CTRL
keys.push(Input::Ctrl)
when Input::ALT
keys.push(Input::Alt)
else
keys.push(key)
end
for k in keys
return true if Input.triggerd?(k)
end
return false
end
#--------------------------------------------------------------------------
# * Mouse Triggered ? (key)
#--------------------------------------------------------------------------
def trigger(key)
return @used_i.include?(key)
end
#--------------------------------------------------------------------------
# * Mouse Pressed ? (key)
#--------------------------------------------------------------------------
def pressed(key)
return true unless Win32API.new("user32","GetKeyState",['i'],'i').call(key).between?(0, 1)
return false
end
#--------------------------------------------------------------------------
# * Repeat (key)
#--------------------------------------------------------------------------
def repeat?(key)
keys = []
case key
when Input::Mouse_Left
keys.push(Input::Mouse_Left)
when Input::DOWN
keys.push(Input::DN)
when Input::UP
keys.push(Input::UPs)
when Input::LEFT
keys.push(Input::LT)
when Input::RIGHT
keys.push(Input::RT)
when Input::C
keys.push(Input::Enter)
keys.push(Input::C)
when Input::B
keys.push(Input::Esc)
keys.push(Input::Numberpad[0])
when Input::X
keys.push(Input::Letters["A"])
when Input::L
keys.push(Input::Letters["Q"])
when Input::R
keys.push(Input::Letters["W"])
when Input::Y
keys.push(Input::Letters["R"])
when Input::F5
keys.push(Input::Fkeys[5])
when Input::F6
keys.push(Input::Fkeys[6])
when Input::F7
keys.push(Input::Fkeys[7])
when Input::F8
keys.push(Input::Fkeys[8])
when Input::F9
keys.push(Input::Fkeys[9])
when Input::SHIFT
keys.push(Input::Shift)
when Input::CTRL
keys.push(Input::Ctrl)
when Input::ALT
keys.push(Input::Alt)
else
keys.push(key)
end
for k in keys
if Input.triggerd?(k)
return true
end
end
return false
end
#--------------------------------------------------------------------------
# * Check (key)
#--------------------------------------------------------------------------
def check(key)
Win32API.new("user32","GetAsyncKeyState",['i'],'i').call(key) & 0x01 != 0 # key 0
end
#--------------------------------------------------------------------------
# * Anykey pressed? ( A or B or C or Down or Up or Right or Left )
#--------------------------------------------------------------------------
def Input.Anykey
return true if @keys != []
return false
end
end
module Keys
MOUSE_PRIMARY = Input::Mouse_Left
MOUSE_SECONDARY = Input::Mouse_Right
def Keys.name?(num)
return "MOUSE PRIMARY" if num==1
return "MOUSE SECONDARY" if num==2
return "MOUSE MIDDLE" if num==4
return "MOUSE 4TH" if num==5
return "MOUSE 5TH" if num==6
return "BACKSPACE" if num==8
return "TAB" if num==9
return "RETURN" if num==13
return "SHIFT" if num==16
return "CTLR" if num==17
return "ALT" if num==18
return "CAPS LOCK" if num==20
return "ESCAPE" if num==27
return "SPACE" if num==32
return "PGUP" if num==33
return "PGDN" if num==34
return "END" if num==35
return "HOME" if num==36
return "LEFT" if num==37
return "UP" if num==38
return "RIGHT" if num==39
return "DOWN" if num==40
return "SNAPSHOT" if num==44
return "INSERT" if num==45
return "DELETE" if num==46
return "0" if num==48
return "1" if num==49
return "2" if num==50
return "3" if num==51
return "4" if num==52
return "5" if num==53
return "6" if num==54
return "7" if num==55
return "8" if num==56
return "9" if num==57
return "A" if num==65
return "B" if num==66
return "C" if num==67
return "D" if num==68
return "E" if num==69
return "F" if num==70
return "G" if num==71
return "H" if num==72
return "I" if num==73
return "J" if num==74
return "K" if num==75
return "L" if num==76
return "M" if num==77
return "N" if num==78
return "O" if num==79
return "P" if num==80
return "Q" if num==81
return "R" if num==82
return "S" if num==83
return "T" if num==84
return "U" if num==85
return "V" if num==86
return "W" if num==87
return "X" if num==88
return "Y" if num==89
return "Z" if num==90
return "LWIN" if num==91
return "RWIN" if num==92
return "APPS" if num==93
return "0" if num==96
return "1" if num==97
return "2" if num==98
return "3" if num==99
return "4" if num==100
return "5" if num==101
return "6" if num==102
return "7" if num==103
return "8" if num==104
return "9" if num==105
return "*" if num==106
return "+" if num==107
return "-" if num==109
return "." if num==110
return "/" if num==111
return "F1" if num==112
return "F2" if num==113
return "F3" if num==114
return "F4" if num==115
return "F5" if num==116
return "F6" if num==117
return "F7" if num==118
return "F8" if num==119
return "F9" if num==120
return "F10" if num==121
return "F11" if num==122
return "F12" if num==123
return "NUM LOCK" if num==144
return "SCROLL LOCK" if num==145
return "LEFT SHIFT" if num==160
return "RIGHT SHIFT" if num==161
return "LEFT CTRL" if num==162
return "RIGHT CTRL" if num==163
return "LEFT ALT" if num==164
return "RIGHT ALT" if num==165
return ";" if num==186
return "=" if num==187
return "," if num==188
return "_" if num==189
return "." if num==190
return "/" if num==191
return "`" if num==192
return "[" if num==219
return " \\ " if num==220
return "]" if num==221
return "'" if num==222
return "??? - " + "#{num}"
end
end
复制代码
看了看好像跟link的要求不太符合{/gg}
作者:
link006007
时间:
2008-6-7 08:14
谢谢ls
写的好长啊
先拿回去 明天再说
作者:
yangff
时间:
2008-6-7 16:28
恩
屏蔽INPUT只要不UPDATE
屏蔽四方位走更简单
另外,我曾经也想写一个RUBY调用自己写的DLL(API方法)
不知道为什么不能编译
C++和VB各一个
不过我不是学C的,难免有错。
所以LZ自己看吧~~
'VB版本(VB数据类型与RUBY区别大大地)
Private Type POINTAPI
x As Long
Y As Long
End Type
Dim p As POINTAPI
Dim l As Long
Dim hd As Long
Dim KeyTepy As Integer
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function ScreenToClient Lib "user32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long
Private Function Get_Pos_X() As Long
If p.x < 0 Then
p.x = 0
End If
If p.x > 544 Then
p.x = 544
End If
Get_Pos_X = p.x
End Function
Private Function Get_Pos_Y() As Long
If p.Y < 0 Then
p.Y = 0
End If
If p.Y > 416 Then
p.Y = 416
End If
Get_Pos_Y = p.Y
End Function
Private Function Get_Left() As Integer
Get_Left = 0
If KeyTepy = 1 Then
Get_Left = 1
End If
End Function
Private Function Get_Right() As Integer
Get_Right = 0
If KeyTepy = 2 Then
Get_Right = 1
End If
End Function
Private Function Updata_Mouse() As Long
If Mouse_Open = True Then
Call GetCursorPos(p)
l = ScreenToClient(hd, p)
Dim x As Long
x = GetAsyncKeyState(1) '左键
KeyTepy = 0
If x = -32767 Then
KeyTepy = 1
End If
x = GetAsyncKeyState(2) '右键
If x = -32767 Then
KeyTepy = 2
End If
Updata_Mouse = 0
Else
Updata_Mouse = 1
End If
End Function
Sub Mouse_Close()
ShowCursor (1)
l = ""
hd = ""
KeyTepy = ""
Mouse_Open = False
End Sub
Private Function Mouse_Start(hWnd As Long) As Long
ShowCursor (0)
hd = hWnd
Mouse_Open = True
Mouse_Start = 0
End Function
复制代码
// C++版本~~
// Mouse Dynamic Link Library.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
#include <"stdio.h">
#include <"windows.h">
// API
[DllImport("user32.dll")]
public static extern short GetKeyState(int nVirtKey);
public const int VK_LBUTTON = 1;
public const int VK_RBUTTON = 2;
int x,y;
long l;
long hd;
long KeyTepy;
bool Mouse_Open;
// API
CPoint point;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
extern long start(long hWnd)
{
Mouse_Open = true;
hd = hWnd;
}
extern long __stdcall Get_Tepy()
{
return KeyTepy;
}
extern long __stdcall Get_Pos_X()
{
return x;
}
extern long __stdcall Get_Pos_Y()
{
return x;
}
extern long __stdcall Mouse_Close()
{
Mouse_Open = false;
}
extern int Updata_Mouse()
{
KeyTepy = 0;
GetCursorPos(&point);
ScreenToClient(hd,&print);
x = point.x;
y = point.y;
if (GetKeyState(VK_LBUTTON) & 0x80) == 0x80
{
KeyTepy = 1;
};
if (GetKeyState(VK_RBUTTON) & 0x80) == 0x80
{
KeyTepy = 2;
};
if (((GetKeyState(VK_LBUTTON) & 0x80) == 0x80) &&
((GetKeyState(VK_RBUTTON) & 0x80) == 0x80))
{
KeyTepy = 3;
};
}
复制代码
作者:
游戏的新手1
时间:
2008-6-7 21:02
标题党的说。。。
作者:
link006007
时间:
2008-6-8 06:31
以下引用
yangff于2008-6-7 8:28:10
的发言:
我写的不是你那样的说....{/gg}
orz 干才在家里下了RM 发现不能用这个dll{/gg}
可能我发的是debug版本的, 哪位同学帮忙编译一下? PM 我
现在不再学校 什么都没有 = =
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1