加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
http://pan.baidu.com/s/1sl1ydVB 密码:fux2
先扔范例。(注:范例不带DLL文件)
这个东西就作为回归之作扔出来好了
虽说之前有地图特效的脚本存在,但本帖的这玩意可不是把画面截图然后做特效处理那么简单的东西,
这东西具有“高效”、“全局适用”的特点,几乎不影响游戏FPS。
先扔脚本和几张预览图
[fold=点我展开脚本][pre lang="ruby"]class String
def byte_length
ret = 0
self.each_byte{ret+=1}
ret
end
def address
[self].pack("p").unpack("L")[0]
end
end
module Fux2
module Win32Tools
@@hModule = 0
RtlMoveMemoryLP = Win32API.new('kernel32','RtlMoveMemory','lpl','l')
RtlMoveMemoryPL = Win32API.new('kernel32','RtlMoveMemory','pll','l')
GetModuleHandle = Win32API.new('kernel32','GetModuleHandle','p','l')
VirtualProtect = Win32API.new('kernel32','VirtualProtect','lllp','l')
GetProcAddress = Win32API.new('kernel32','GetProcAddress','lp','l')
CallWindowProc = Win32API.new('user32','CallWindowProc','ppll','v')
GetLastError = Win32API.new('kernel32','GetLastError','v','l')
def self.readmem(buf,addr,len)
RtlMoveMemoryPL.call(buf,addr,len)
end
def self.writemem(addr,buf,len)
RtlMoveMemoryLP.call(addr,buf,len)
end
def self.unprotect(addr,len)
VirtualProtect.call(addr,len,0x40,"\0"*4)
end
def self.init
end
def self.cache_module_handle
@@hModule = GetModuleHandle.call("RGSS300.dll")
@@hGdi32 = GetModuleHandle.call("gdi32.dll")
end
def self.module_handle
@@hModule
end
def self.gdi32_handle
@@hGdi32
end
def self.callfunc(funcstr,args)
CallWindowProc.call(funcstr,args,0,0)
end
def self.getprocaddress(procname)
GetProcAddress.call(module_handle,procname)
end
def self.getgdiprocaddress(procname)
GetProcAddress.call(gdi32_handle,procname)
end
cache_module_handle
end
module Chicken
@@hwnd = 0
Addr_Close_Catch = Win32Tools.module_handle+0x17F396
Addr_Eval = Win32Tools.module_handle+0xC580
Addr_Hwnd = Win32Tools.module_handle+0x25EB00
def self.unprotectfunc(func)
Fux2::Win32Tools.unprotect(func.address,func.byte_length)
end
def self.get_hwnd
rem = "\0"*4
Fux2::Win32Tools.readmem(rem,Addr_Hwnd,4)
base_addr = rem.unpack("L")[0]
Fux2::Win32Tools.readmem(rem,base_addr+8,4)
@@hwnd = rem.unpack("L")[0]
end
def self.hwnd
@@hwnd
end
def self.init
get_hwnd
end
end
module CodeBox
@@rem_vars = "\0"*200
Nothing = "\x90"*12
Dirt = [0x60,0xBB,@@rem_vars.address,0x8B,0x72,0x48,0x8B,0x7A,0x4C,0x8B,0x52,0x10,0x0F,0xAF,0xF7,0x8B,0xFA,0x33,0xC9,0xC7,0x43,0x30,0x00,0x00,0x00,0x00,0xC7,0x43,0x34,0x00,0x00,0x00,0x00,0x3B,0xCE,0x0F,0x8D,0x9D,0x00,0x00,0x00,0x33,0xC0,0x33,0xD2,0x56,0x33,0xF6,0x8A,0x04,0x8F,0x8A,0x53,0x34,0x2A,0xC2,0x66,0x05,0x80,0x00,0x66,0xBE,0x03,0x00,0x66,0xF7,0xEE,0x66,0xBE,0x0A,0x00,0x66,0xF7,0xF6,0x88,0x43,0x38,0x33,0xC0,0x33,0xD2,0x33,0xF6,0x8A,0x44,0x8F,0x01,0x8A,0x53,0x34,0x2A,0xC2,0x66,0x05,0x80,0x00,0x66,0xBE,0x3B,0x00,0x66,0xF7,0xEE,0x66,0xBE,0x64,0x00,0x66,0xF7,0xF6,0x88,0x43,0x39,0x33,0xC0,0x33,0xD2,0x33,0xF6,0x8A,0x44,0x8F,0x01,0x8A,0x53,0x36,0x2A,0xC2,0x66,0x05,0x80,0x00,0x66,0xBE,0x0B,0x00,0x66,0xF7,0xEE,0x66,0xBE,0x64,0x00,0x66,0xF7,0xF6,0x88,0x43,0x3A,0x8A,0x44,0x8F,0x03,0x88,0x43,0x3B,0x8A,0x43,0x38,0x02,0x43,0x39,0x02,0x43,0x3A,0x02,0x43,0x3B,0x88,0x04,0x8F,0x88,0x44,0x8F,0x01,0x88,0x44,0x8F,0x02,0x8B,0x43,0x30,0x89,0x43,0x34,0x8B,0x04,0x8F,0x89,0x43,0x30,0x5E,0x41,0xE9,0x5B,0xFF,0xFF,0xFF,0x61,*([0x90]*120)].pack("C2LC*")
Emboss = [0x60,0xBB,@@rem_vars.address,0x8B,0x72,0x48,0x8B,0x7A,0x4C,0x8B,0x52,0x10,0x0F,0xAF,0xF7,0x8B,0xFA,0x8B,0x0F,0x89,0x4B,0x30,0xC7,0x43,0x34,0x00,0x00,0x00,0x00,0x33,0xC9,0x3B,0xCE,0x0F,0x8D,0x83,0x00,0x00,0x00,0x56,0x8B,0x04,0x8F,0x89,0x43,0x50,0x33,0xC0,0x33,0xD2,0x33,0xF6,0x8A,0x04,0x8F,0x8A,0x53,0x34,0x2B,0xC2,0x05,0x80,0x00,0x00,0x00,0x6B,0xC0,0x26,0x89,0x43,0x40,0x33,0xC0,0x33,0xD2,0x8A,0x44,0x8F,0x01,0x8A,0x53,0x34,0x2B,0xC2,0x05,0x80,0x00,0x00,0x00,0x6B,0xC0,0x4B,0x89,0x43,0x44,0x33,0xC0,0x33,0xD2,0x8A,0x44,0x8F,0x01,0x8A,0x53,0x36,0x2B,0xC2,0x05,0x80,0x00,0x00,0x00,0x6B,0xC0,0x0F,0x89,0x43,0x48,0x03,0x43,0x44,0x03,0x43,0x40,0xC1,0xE8,0x07,0x3D,0xFF,0x00,0x00,0x00,0x7E,0x05,0xB8,0xFF,0x00,0x00,0x00,0x88,0x04,0x8F,0x88,0x44,0x8F,0x01,0x88,0x44,0x8F,0x02,0x8B,0x43,0x30,0x89,0x43,0x34,0x8B,0x43,0x50,0x89,0x43,0x30,0x5E,0x41,0xE9,0x75,0xFF,0xFF,0xFF,0x61,*([0x90]*120)].pack("C2LC*")
Mosaic = [0x60,0xBB,@@rem_vars.address,0x8B,0x72,0x48,0x8B,0x7A,0x4C,0x8B,0x52,0x10,0x89,0x53,0x20,0x33,0xC9,0x33,0xD2,0x3B,0xD7,0x7D,0x33,0x3B,0xCE,0x7D,0x29,0x8B,0x43,0x20,0x51,0x52,0x0F,0xAF,0xD6,0x03,0xD1,0x6B,0xD2,0x04,0x8B,0x0C,0x10,0x89,0x4C,0x10,0x04,0x03,0xD6,0x03,0xD6,0x03,0xD6,0x03,0xD6,0x89,0x0C,0x10,0x89,0x4C,0x10,0x04,0x5A,0x59,0x41,0x41,0xEB,0xD3,0x42,0x42,0x33,0xC9,0xEB,0xC9,0x61,*([0x90]*120)].pack("C2LC*")
end
module Graphics_Filter
include CodeBox
Inject_Addr = Win32Tools.module_handle+0x10FEFE
def self.init
rem_origin
calc_all
inject_filter(Nothing)
end
def self.rem_origin
@@rem_origin = "\0"*7
readmem(@@rem_origin,Inject_Addr,7)
@@rem_inject = {}
end
def self.calc_all
CodeBox.constants.each do |cn|
con = CodeBox.const_get(cn)
Chicken.unprotectfunc(con)
cad = con.address
cal = con.byte_length
retn_addr = Inject_Addr+5-cad-cal
hook_addr = cad-Inject_Addr-5
@@rem_inject[cad] = hook_addr
ender = [*@@rem_origin.unpack("C*"),0xE9,retn_addr].pack("C7CL")
writemem(cad+cal-12,ender,12)
end
end
def self.writemem(addr,buf,len)
Win32Tools.writemem(addr,buf,len)
end
def self.readmem(buf,addr,len)
Win32Tools.readmem(buf,addr,len)
end
def self.inject_filter(str)
delete_filter
hook_addr = @@rem_inject[str.address]
writemem(Inject_Addr,[0xE9,hook_addr,0x90,0x90].pack("CLCC"),7)
end
def self.delete_filter
writemem(Inject_Addr,@@rem_origin,7)
end
def self.start_mosaic
#~ cad = Mosaic.address
#~ cal = Mosaic.byte_length
#~ gcadr = Win32Tools.getgdiprocaddress("GetCurrentObject")-cad-20
#~ gbadr = Win32Tools.getgdiprocaddress("GetObjectA")-cad-29
#~ writemem(cad+16,[gcadr].pack("L"),4)
#~ writemem(cad+25,[gbadr].pack("L"),4)
inject_filter(Mosaic)
end
def self.start_emboss
inject_filter(Emboss)
end
def self.start_dirt
inject_filter(Dirt)
end
def self.start_inverse
writemem(Win32Tools.module_handle+0x10FEFA,[0x330008].pack("L"),4)
end
def self.end_inverse
writemem(Win32Tools.module_handle+0x10FEFA,[0xCC0020].pack("L"),4)
end
end
def self.init
Win32Tools.init
Chicken.init
Graphics_Filter.init
end
init
end
module Graphics
class << self
def apply_filter(med,*args)
Fux2::Graphics_Filter.method(med).call(*args)
end
def cancel_filter
Fux2::Graphics_Filter.delete_filter
end
def start_inverse
Fux2::Graphics_Filter.start_inverse
end
def cancel_inverse
Fux2::Graphics_Filter.end_inverse
end
end
end[/pre][/fold]
用法嘛还是参见范例吧。
再来几张图
马赛克效果
浮雕效果
雪花屏效果,这个要特别说明一下,这个是做浮雕效果无意中做出来的东西,是动态的,
比较影响效率
|