赞 | 451 |
VIP | 56 |
好人卡 | 75 |
积分 | 423 |
经验 | 124650 |
最后登录 | 2024-11-13 |
在线时间 | 7598 小时 |
Lv5.捕梦者 (管理员) 老黄鸡
- 梦石
- 0
- 星屑
- 42329
- 在线时间
- 7598 小时
- 注册时间
- 2009-7-6
- 帖子
- 13505
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
应某坛友需求而发,希望有人用得上。
使用Fux2.stop_se(文件名)即可停止播放同名文件的se。
简要分析,VA实际上最多只能同时播放32个se音频,播放时找到第一个未被使用或者已经播放完毕的se序号
参看下列代码各位也可以改成精确的按编号停止播放se,而不是按文件名。
(请不要与本人其他奇怪的脚本混合使用)
module Fux2 GM = Win32API.new('kernel32','GetModuleHandle','p','l') PSP = Win32API.new('kernel32','RtlMoveMemory','pll','v') PPSP = Win32API.new('kernel32','RtlMoveMemory','ppl','v') U2S = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i') STOP_SE = Win32API.new('RGSS300','RGSSGetInt','v','v') BASE_ADDR = GM.call("RGSS300.dll") buf = "\0"*4 PSP.call(buf,BASE_ADDR + 0x25EB04,4) SE_LIST_ADDR = buf.unpack("L")[0]+0x14 SE_STOP_CALL_ADDR = 0x1171C3 CODE_ADDR = BASE_ADDR+0x37A0 CODE = [0x55].pack("C*") CODE += [0x8B,0xEC].pack("C*") CODE += [0xB9,0,0,0,0].pack("C*") CODE += [0xE8].pack("C")+[SE_STOP_CALL_ADDR].pack("L") CODE += [0x33,0xC0,0x8B,0xE5,0x5D,0xC3].pack("C*") PPSP.call(CODE_ADDR,CODE,CODE.size) def self.set_addr(num) tn = [num].pack("L") PPSP.call(CODE_ADDR+4,tn,4) end def self.stop_se(filename=nil) unless filename Audio.se_stop return false end buf = "\0"*4 (0...32).each do |i| PSP.call(buf,SE_LIST_ADDR+i*4,4) p_this_se = buf.unpack("L")[0] p_this_se_name = p_this_se+0x70 namebuf = "\0"*0x220 PSP.call(namebuf,p_this_se_name,0x220) p_this_se_name = "\0"*220 if U2S.call(0,0,namebuf,-1,p_this_se_name,0x110,nil,nil)>0 p_this_se_name = p_this_se_name.unpack("A*")[0] if p_this_se_name==filename set_addr(p_this_se) STOP_SE.call end end end return true end end #Audio.se_play("Audio/SE/ui_unique_get.wav") #Fux2.stop_se("Audio/SE/ui_unique_get.wav")
module Fux2
GM = Win32API.new('kernel32','GetModuleHandle','p','l')
PSP = Win32API.new('kernel32','RtlMoveMemory','pll','v')
PPSP = Win32API.new('kernel32','RtlMoveMemory','ppl','v')
U2S = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
STOP_SE = Win32API.new('RGSS300','RGSSGetInt','v','v')
BASE_ADDR = GM.call("RGSS300.dll")
buf = "\0"*4
PSP.call(buf,BASE_ADDR + 0x25EB04,4)
SE_LIST_ADDR = buf.unpack("L")[0]+0x14
SE_STOP_CALL_ADDR = 0x1171C3
CODE_ADDR = BASE_ADDR+0x37A0
CODE = [0x55].pack("C*")
CODE += [0x8B,0xEC].pack("C*")
CODE += [0xB9,0,0,0,0].pack("C*")
CODE += [0xE8].pack("C")+[SE_STOP_CALL_ADDR].pack("L")
CODE += [0x33,0xC0,0x8B,0xE5,0x5D,0xC3].pack("C*")
PPSP.call(CODE_ADDR,CODE,CODE.size)
def self.set_addr(num)
tn = [num].pack("L")
PPSP.call(CODE_ADDR+4,tn,4)
end
def self.stop_se(filename=nil)
unless filename
Audio.se_stop
return false
end
buf = "\0"*4
(0...32).each do |i|
PSP.call(buf,SE_LIST_ADDR+i*4,4)
p_this_se = buf.unpack("L")[0]
p_this_se_name = p_this_se+0x70
namebuf = "\0"*0x220
PSP.call(namebuf,p_this_se_name,0x220)
p_this_se_name = "\0"*220
if U2S.call(0,0,namebuf,-1,p_this_se_name,0x110,nil,nil)>0
p_this_se_name = p_this_se_name.unpack("A*")[0]
if p_this_se_name==filename
set_addr(p_this_se)
STOP_SE.call
end
end
end
return true
end
end
#Audio.se_play("Audio/SE/ui_unique_get.wav")
#Fux2.stop_se("Audio/SE/ui_unique_get.wav")
|
|