找回密码
 点一下
查看: 1820|回复: 7

【原创】MuitipleUserData——单位多重自定义值系统

[复制链接]
发表于 2009-1-15 21:31:42 | 显示全部楼层 |阅读模式
功能
就是允许给每个单位附带多达256个的自定义值,相当与给每个单位绑定一个数组(大小只有256)
特点
没有什么技术含量,不过自己突然想到的思路而已,如有雷同纯熟巧合- -|
用GameCache + Return Bug 可以实现对单位数据的绑定,也可以实现模拟数组绑定。这个系统则采取了一个新的思路 ,相对于其他用Hash算法将单位的句柄值映射到数组索引的系统,这个系统没有用单位的句柄值,而是使用了单位组作为数据存储的媒介
优点
系统简单,只使用了一个全局的单位组数组,不用声明其他的数组来存储单位的自定义值,单位的自定义值数量有256个的上限,单位数量则没有上限。
效率
因为对单位组的操作是上层操作,运行效率自然比不上使用Hash算法将单位的句柄值映射到数组索引的系统
和游戏缓存相比,应该是有优势的
接口
udg_MUD_Group[] 唯一的全局单位组数组
udg_MUD_MaxIndex 记录最大可用索引

InitMultiUserData(integer maxIndex)
初始化函数,可以指定maxIndex(0至255),此数目决定了给单位绑定的数组的最大索引,与初始化时建立的单位组的数量正相关
SetUnitUserDataByIndex(unit u,integer index,integer value)
按索引设置单位的自定义值,范围是 -1073741823 ~ 1073741823 (2的30次方减1)
设置为0则为清空该单位在此索引的自定义值,回收内存
GetUnitUserDataByIndex(unit u,integer index,integer value)
按索引获取单位的自定义值
  
代码
[codes=jass]
function InitMultipleUserData takes integer maxIndex returns nothing  
        local integer GroupNum  
        local integer i  
        //  
        if maxIndex == 0 or maxIndex > 255 then                              // 0默认为最大数量,即每个单位可存储256个整数  
                set udg_MUD_MaxIndex = 255                                       // 256 * 32 = 8192  
        else  
                set udg_MUD_MaxIndex = maxIndex  
        endif  
        //  
        set i = 1                                                                                        //MUD_Group[0]被在声明全局变量时被系统默认初始化  
        set GroupNum = 32 * udg_MUD_MaxIndex  
        loop  
                exitwhen i == GroupNum  
                set udg_MUD_Group = CreateGroup()  
                set i = i + 1  
        endloop
endfunction  
        


function SetUnitUserDataByIndex takes unit u,integer index,integer toSet returns boolean  
        local integer i  
        local integer lowBit  
        local integer highBit  
        local integer temp = IAbsBJ(toSet)  


        if index > udg_MUD_MaxIndex then  
                call BJDebugMsg("|c00ff0000错误:索引越界,请在初始化中调整最大索引大小!|r")  
                return false  
        endif  

        if temp > 1073741823 then  
        // 1073741823 = Pow(2,30) - 1,最后一位用来存取符号  
                call BJDebugMsg("|c00ff0000错误:整数大小越界!|r")  
                return false  
        endif  


        set lowBit = index * 32  
        set highBit = lowBit + 32  
        set i = lowBit  
        loop  
        //清空该单位在这个索引的数据  
                if IsUnitInGroup(u,udg_MUD_Group) then  
                call GroupRemoveUnit(udg_MUD_Group,u)  
                endif  
                set i = i + 1  
                exitwhen i == highBit  
        endloop  


        if toSet != 0 then  
                set i = lowBit  
                loop  
                        if ModuloInteger(temp,2) == 1 then  
                                call GroupAddUnit(udg_MUD_Group,u)  
                        endif  
                        set temp = temp/2  
                        set i = i + 1  
                        exitwhen i == highBit - 1 or temp == 0  
                endloop  
                if toSet < 0 then  
                //最后一位用来存放符号  
                        call GroupAddUnit(udg_MUD_Group[highBit-1],u)  
                endif  
        endif  
        return true
endfunction



function GetUnitUserDataByIndex takes unit u,integer index returns integer  
        local integer temp = 1  
        local integer i  
        local integer lowBit  
        local integer highBit  
        local integer value = 0  

        if index > udg_MUD_MaxIndex then  
                call BJDebugMsg("|c00ff0000错误:索引越界|r")  
                return 0  
        endif  

        set lowBit = index * 32  
        set highBit = lowBit + 32  
        set i = lowBit  
        loop  
                if IsUnitInGroup(u,udg_MUD_Group) then  
                set value = value + temp  
                endif  
                set i = i + 1  
                set temp = temp * 2  
                exitwhen i == highBit - 1  
        endloop  

        if IsUnitInGroup(u,udg_MUD_Group) then  
                set value = -value  
        endif  

        return value
endfunction[/codes]

  实在不会JASS高亮………………
还请大家指出不足之处,万分感谢~~~~

评分

参与人数 1威望 +32 收起 理由
kook + 32 很有趣的想法

查看全部评分

发表于 2009-1-15 23:12:57 | 显示全部楼层
对于我这个J盲来说
不是汉字的地方,全都很不足
回复

使用道具 举报

 楼主| 发表于 2009-1-16 12:19:05 | 显示全部楼层
沙发就这样没了
没有人吗?无奈啊无奈…………
回复

使用道具 举报

发表于 2009-1-16 12:50:59 | 显示全部楼层
厄,对老,记得以前用256内容的机器如果一个非空组里单位超过几十个就卡得很厉害,不知道现在怎么样
回复

使用道具 举报

发表于 2009-1-25 22:05:01 | 显示全部楼层
提醒:使用缓存会导致未知bug
回复

使用道具 举报

发表于 2009-1-25 22:13:10 | 显示全部楼层
未知bug与缓存是什么关系呢
回复

使用道具 举报

发表于 2009-1-27 17:40:11 | 显示全部楼层
就是很神奇很诡异,因机器而异的各种bug
回复

使用道具 举报

发表于 2009-2-11 15:11:32 | 显示全部楼层
我情愿给每个玩家一堆整数.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-23 21:30 , Processed in 0.149466 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表