1.使用throw 抛出异常,结束判断,立即返回
check(Player, Goods, Count) ->
try
Info = Player#player.info,
Time = misc:seconds(),
case map_api:check_goods(Info#info.map_id, Goods#goods.goods_id) of
?true ->
?ok = check_count(Goods#goods.count, Count),
?ok = check_pro(Info#info.pro, Goods#goods.pro),
?ok = check_sex(Info#info.sex, Goods#goods.sex),
?ok = check_lv(Info#info.lv, Goods#goods.lv),
?ok = check_time(Time, Goods#goods.start_time, Goods#goods.end_time),
?ok = check_vip(Player#player.vip, Goods#goods.vip),
?ok = check_country(Info#info.country, Goods#goods.country),
?ok;
?false ->
{?error, 110}
end
catch
throw:Return ->
Return;
_:_ ->
{?error, unknow}
end.
%% 检查物品数量
check_count(Count, RequestCount) when 0 =< Count andalso Count =< RequestCount -> ?ok;
check_count(_, _) -> throw({?error, 110}).
%% 检查职业
check_pro(_Pro, ?CONST_SYS_PRO_NULL) -> ?ok;
check_pro(Pro, Pro) -> ?ok;
check_pro(_, _) -> throw({?error, ?EGOODS_PROFESION_NOT_FIT}).
%% 检查性别
check_sex(_Sex, ?CONST_SYS_SEX_NULL) -> ?ok;
check_sex(Sex, Sex) -> ?ok;
check_sex(_, _) -> throw({?error, 110}).
%% 检查等级
check_lv(_Lv, 0) -> ?ok;
check_lv(Lv, RequestLv) when Lv >= RequestLv -> ?ok;
check_lv(_, _) -> throw({?error, ?EGOODS_LV_NOT_FIT}).
%% 检查有效期
check_time(_Time, 0, 0) -> ?ok;
check_time(Time, 0, EndTime) when Time =< EndTime -> ?ok;
check_time(Time, StartTime, 0) when Time >= StartTime -> ?ok;
check_time(Time, StartTime, EndTime) when Time >= StartTime andalso Time =< EndTime -> ?ok;
check_time(_, _, _) -> throw({?error, 110}).
%% 检查VIP
check_vip(_Vip, 0) -> ?ok;
check_vip(Vip, RequestVip) when Vip >= RequestVip -> ?ok;
check_vip(_, _) -> throw({?error, 110}).
%% 检查国家
check_country(_Country, 0) -> ?ok;
check_country(Country, Country) -> ?ok;
check_country(_, _) -> throw({?error, 110}).
2,使用多层匹配,减少嵌套。
Guild = ets_api:lookup(?CONST_ETS_GUILD, GuildId),
GulildPlayer = Player#player.guild,
GuildMember = ets_api:lookup(?CONST_ETS_GUILD_MEMBER, UserId),%%申请人
ApplyList = Guild#ets_guild.apply ,
Apply = lists:keyfind(UserId, #apply.player_id, ApplyList),
case {GulildPlayer#guild.guild_pos >?CONST_GUILD_POSITION_ELDER,
Guild#ets_guild.num_current >= Guild#ets_guild.num_limit,
Apply#apply.is_cancel =:= 1,
is_record(GuildMember, ets_guild_member) andalso GuildMember#ets_guild_member.guild_id > 0} of
{?true,_,_,_} -> %%权限不足
TipPacket = message_api:msg_notice(?TIP_GUILD_DEALAPPLY_NOPREMISS),
misc_packet:send(Player#player.net_pid, TipPacket);
{_,?true,_,_} -> %%成员上限
TipPacket = message_api:msg_notice(?TIP_GUILD_DEALAPPLY_MEMBEROVER),
misc_packet:send(Player#player.net_pid, TipPacket);
{_,_,?true,_} -> %%取消申请
TipPacket = message_api:msg_notice(?TIP_GUILD_DEALAPPLY_CANCELAPPLY),
misc_packet:send(Player#player.net_pid, TipPacket);
{_,_,_,?true} -> %%已加入军团
TipPacket = message_api:msg_notice(?TIP_GUILD_DEALAPPLY_REJOIN),
misc_packet:send(Player#player.net_pid, TipPacket);
{?false,?false,?false,?false} ->
GuildId = Guild#ets_guild.id,
GuildName = Guild#ets_guild.name,
分享到:
相关推荐
看到另外两个分好高,我把另外两个二合一啦。远古封神+英雄远征的ERLANG游戏服务器代码,看过了,感觉不错的。
erlang并发编程实战源代码erlang并发编程实战源代码
[Erlang程序设计]源代码,包括了erlang程序设计一书全部实例代码;
Erlang 新的语言,配套资料的源代码,可以操练一下。
这个是在erlang protobuf改进版本的代码,效率有很大提升,配套文章地址http://blog.csdn.net/mycwq/article/details/42122439
erlang otp in action 代码
Joe Armstrong [Erlang程序设计].中文版 和随书源代码 一本不错的Erlang学习书籍!
kmp游戏中使用频率较高,所以用erlang代码代码实现,效率还行。
我自己在新学erlang,在LeetCode OJ上找了题目练习,题目很适合新手熟悉语言,但是LeetCode OJ里面只有几门主流语言的答案,下面是已完成的erlang源代码,后续有空再做其他问题续传,题目包含:(源码开头都有题目...
高性能集群服务器Erlang解决方案
Erlang程序设计第2版附书代码,结合Erlang程序设计第2版边看书,边测试代码,效果好。
erlang入门电子书 erlang编程 Introducing Erlang,作者Simon.St.Laurent
● 热代码升级-Erlang允许程序代码在运行系统中被修改。旧代码能被逐步淘汰而后被新代码替换。在此过渡期间,新旧代码是共存的。 ●递增式代码装载-用户能够控制代码如何被装载的细节。 ●外部接口-Erlang进程与外部...
erlang发明者写的书。erlang/otp一种高可靠性的平台。
二郎助手,专为erlang语言开发的开发工具。完全免费,源代码开源(VS2005开发)。
本书不适用于初学者。从大多数教程、书籍以及培训课程上所学到的知识,还...本书不要求读者知道如何调试Erlang软件,如何理解已有的代码库,如何诊断问题,以及知 道一些如何在生产环境中部署Erlang的最佳实践F 18 F。
Erlang程序设计入门经典,中文高清版,随书光盘源码
erlang 安装包
使用rebar生成erlang release 并进行热代码升级使用rebar生成erlang release 并进行热代码升级使用rebar生成erlang release 并进行热代码升级使用rebar生成erlang release 并进行热代码升级
Erlang及其应用Erlang及其应用Erlang及其应用