//public static bool apply_skill_eff_to(long cur_clock_tm, IBaseUnit from, IBaseUnit target, dmg dmg, int aff, int skill_id, int percentage) //{ // tres sk_res = new tres(); // sk_res.rate = 100; // return apply_skill_eff_to(cur_clock_tm, from, target, sk_res, aff, skill_id, percentage); //} public static bool apply_skill_eff_to(long cur_clock_tm, IBaseUnit from, IBaseUnit target, tres_conf sk_res, int aff, int skill_id, int percentage) { var dflag = true; if (target.isdie() || target.isghost()) { // TO DO : 考虑有些技能能作用于尸体 if (dflag) Utility.debug(" !apply_skill_eff_to false 1"); return false; } if (target.ignore_dmg()) { if (dflag) Utility.debug(" !apply_skill_eff_to false 2"); return false; } //if ( "rate" in sk_res ) if (sk_res.rate > 0) { if (Utility.random(0, 100) > sk_res.rate) { if (dflag) Utility.debug(" !apply_skill_eff_to false 3"); return false; } } var to_pl = target.get_pack_data(); var frm_pl = from.get_pack_data(); //var rpc_data = new Variant(); //rpc_data["hited"] = 3; //rpc_data["sid"] = skill_id; //rpc_data["frm_iid"] = frm_pl.iid; //rpc_data["to_iid"] = to_pl.iid; if (target.has_state(pl_state_type.PST_SKILL_AVOID)) { // 目标技能免疫 // send single_skill_res msg to clients //rpc_data["hited"] = 0;//免疫 //target.broad_cast_zone_msg_and_self(22, rpc_data); if (dflag) Utility.debug(" !apply_skill_eff_to false 4"); return false; } //if(from.get_sprite_type() == map_sprite_type.MST_MONSTER && target.get_sprite_type() == map_sprite_type.MST_MONSTER) //{ // return false; // 一家人不打一家人 //} // TO DO : 根据aff判断敌人、盟友关系从而确定是否受此状态影响 game_err_code check_res = Utility.check_target_type(from, target, aff, target.gmap.pk_seting); if (check_res != game_err_code.RES_OK) return false; if (from.get_sprite_type() == map_sprite_type.MstPlayer) { if (target.can_atk(from)) { target.atk_by(from); } } //if(sk_res.hp_dmg != 0) //{ // rpc_data.hp_dmg <- {}; // rpc_data.hp_dmg.hp_dmg <- sk_res.hp_dmg; // to_pl.hp -= sk_res.hp_dmg; // if(to_pl.hp > to_pl.max_hp) // { // to_pl.hp = to_pl.max_hp; // } //} //if(sk_res.mp_dmg != 0) //{ // rpc_data.mp_dmg <- {}; // rpc_data.mp_dmg.mp_dmg <- sk_res.mp_dmg; // to_pl.mp -= sk_res.mp_dmg; // if(to_pl.mp > to_pl.max_mp) // { // to_pl.mp = to_pl.max_mp; // } //} Utility.debug("apply_skill_eff_to try apply_dmg_on_pl!"); //no_dmg 不计算伤害 if (sk_res.no_dmg == 0) { var ret = grid_map.apply_dmg_on_pl(target, from, sk_res.convert2damage(), cur_clock_tm, percentage, true); Utility.debug("!apply_skill_eff_to apply_dmg_on_pl:" + ret); if (ret["hited"]._int32 != 3) { // 未命中 // send single_skill_res msg to clients //rpc_data["hited"] = ret["hited"]; //target.broad_cast_zone_msg_and_self(22, rpc_data); if (dflag) Utility.debug(" !apply_skill_eff_to false 20"); return false; } } //sys.trace(sys.SLT_DETAIL, "sk_res.rmv_stat ["+sk_res.rmv_stat+"]\n"); if (sk_res.rmv_stat > 0) { int rmv_stat = sk_res.rmv_stat; if (to_pl.states != null) { //sys.dumpobj(to_pl.states); // 移除所有状态 rmv_stat_from_pl_by_gb(rmv_stat, target, to_pl); } } if (sk_res.rmv_1stat > 0) { if (to_pl.states != null) { // 移除一个状态 rmv_1stat_from_pl_by_gb(sk_res.rmv_1stat, target, to_pl); } } if (sk_res.tar_state > 0) { int tar_state = sk_res.tar_state; var add_stat = true; if (sk_res.stat_rat > 0) { // 有几率触发技能效果 var judg = Utility.random(0, 100); if (judg > sk_res.stat_rat) { //sys.trace(sys.SLT_DETAIL, "stat_rat["+sk_res.stat_rat+"] < judg["+judg+"]\n"); if (dflag) Utility.debug(" !apply_skill_eff_to false 21"); add_stat = false; } } if (add_stat) { // add state eff to character var state_obj = add_state_to_pl(cur_clock_tm, target, sk_res, from, percentage); if (state_obj != null) { // rpc_data.states < -state_obj; //rpc_data.states <- {}; //rpc_data.states.id <- state_obj.id; //rpc_data.states.par <- state_obj.par; //rpc_data.states.start_tm <-state_obj.start_tm; //rpc_data.states.end_tm <- state_obj.end_tm; } } } if (sk_res.cd_red != null) { // 减少cd //var skcds = []; foreach (var cd_red in sk_res.cd_red) { int sktp = cd_red.sktp; int cd_reduce = (cd_red.red_tm * percentage / 10); if (sktp == 0) { foreach (int sk_key in to_pl.skill_cd.Keys) { //cd -= (sk_res.cd_red.red_tm * 100 * per / 1000); to_pl.skill_cd[sk_key] -= cd_reduce; //skcds.push({ sktp = sktp, cdtm = cd - cur_clock_tm}); } } else if (to_pl.skill_cd.ContainsKey(sktp)) { to_pl.skill_cd[sktp] -= cd_reduce; //skcds.push({ sktp = cd_red.sktp, cdtm = to_pl.skill_cd[cd_red.sktp] - cur_clock_tm}); } } // if (skcds.len() > 0) // { //// send self_attchange msg //::send_rpc(to_pl.sid, 32, { skcds = skcds}); // } } if (!to_pl.cfmv) { if (sk_res.fmv != null) { var judge = Utility.random(0, 100); int fmv_rate = sk_res.fmv.rate; int fmv_dir = sk_res.fmv.dir; int fmv_rang = sk_res.fmv.rang; if (judge < fmv_rate) { var dir = fmv_dir; if (dir == 2) {//随机前后 dir = Utility.random(0, 2); } // 迫使目标移动 if (dir == 0) { // 远离自己的方向 var dist_x = to_pl.x - frm_pl.x; var dist_y = to_pl.y - frm_pl.y; if ((dist_x != 0) || (dist_y != 0)) { var vec = Utility.normalize_vec2(dist_x, dist_y); var from_x = to_pl.x; var from_y = to_pl.y; to_pl.x += (int)(vec.x * fmv_rang); to_pl.y += (int)(vec.y * fmv_rang); var dest_pos = target.gmap.valpoint_on_vector(to_pl.x, to_pl.y, from_x, from_y, vec); var to_grid_pos = target.gmap.get_grid_by_pt(dest_pos.x, dest_pos.y); //if(!to_grid_pos || (dest_pos.x < 0) || (dest_pos.y < 0)) //{ // // 目标坐标非法,出错 // Utility.trace_err("fmv frm_pl.x["+frm_pl.x+"] frm_pl.y["+frm_pl.y+"] from_x["+from_x+"] y["+from_y+"] to_pl.x["+to_pl.x+"] to_pl.y["+to_pl.y+"] dest_pos.x["+dest_pos.x+"] dest_pos.y["+dest_pos.y+"] vec:\n"); // sys.dumpobj(vec); //} to_pl.x = (int)dest_pos.x; to_pl.y = (int)dest_pos.y; //sys.trace(sys.SLT_DETAIL, "fmv to_pl.x["+to_pl.x+"] ["+to_pl.y+"]\n"); if (target.get_sprite_type() == map_sprite_type.MstPlayer && !target.is_in_lvl) { to_pl.lx = to_pl.x; to_pl.ly = to_pl.y; } } } else if (dir == 1) { // 靠近自己的方向 var dist_x = frm_pl.x - to_pl.x; var dist_y = frm_pl.y - to_pl.y; if ((dist_x != 0) || (dist_y != 0)) { var dist2 = dist_x * dist_x + dist_y * dist_y; var vec = Utility.normalize_vec2(dist_x, dist_y); if (fmv_rang == 0 || fmv_rang * fmv_rang >= dist2) { // 拉近到自己身边一格 var from_x = to_pl.x; var from_y = to_pl.y; to_pl.x = (int)(frm_pl.x - vec.x * game_const.map_grid_pixel); to_pl.y = (int)(frm_pl.y - vec.y * game_const.map_grid_pixel); var dest_pos = target.gmap.valpoint_on_vector(to_pl.x, to_pl.y, from_x, from_y, vec); to_pl.x = (int)dest_pos.x; to_pl.y = (int)dest_pos.y; if (target.get_sprite_type() == map_sprite_type.MstPlayer && !target.is_in_lvl) { to_pl.lx = to_pl.x; to_pl.ly = to_pl.y; } } else { var from_x = to_pl.x; var from_y = to_pl.y; to_pl.x += (int)(vec.x * fmv_rang); to_pl.y += (int)(vec.y * fmv_rang); var dest_pos = target.gmap.valpoint_on_vector(to_pl.x, to_pl.y, from_x, from_y, vec); to_pl.x = (int)dest_pos.x; to_pl.y = (int)dest_pos.y; if (target.get_sprite_type() == map_sprite_type.MstPlayer && !target.is_in_lvl) { to_pl.lx = to_pl.x; to_pl.ly = to_pl.y; } } } } } if (to_pl.moving != null) { // 停止移动 //var data = { tm = cur_clock_tm, iid = to_pl.iid, x = to_pl.x, y = to_pl.y, face = to_pl.face }; // send stop move msg to clients //target.gmap.broadcast_map_rpc(10, data); //target.broad_cast_zone_msg_and_self(10, data); //delete to_pl.moving; to_pl.moving = null; } to_pl.last_mvpts = null; //rpc_data.fmv < - { to_x = to_pl.x, to_y = to_pl.y, dir = sk_res.fmv.dir}; if (to_pl.casting != null) { // 停止施法 //var data = { iid = to_pl.iid }; // send cancel_casting_res to clients //target.broad_cast_zone_msg_and_self(29, data); //delete to_pl.casting; to_pl.casting = null; } } } //var gmap = target.gmap; //if(to_pl.hp <= 0) //{ // // die! // to_pl.hp = 0; // target.die(from); // rpc_data.isdie = true; //} // send single_skill_res msg to clients //gmap.broadcast_map_rpc(22, rpc_data); //target.broad_cast_zone_msg_and_self(22, rpc_data); return true; }
public static bool apply_skill_eff_to(long now, IBaseUnit from, IBaseUnit target, skill_state_conf sk_res, int aff, int percentage) { if (target.isghost() || target.isdie()) return false; if (target.ignore_dmg()) return false; if (sk_res.rate > 0) { if (new Random().Next(0, 100) > sk_res.rate) return false; } if (target.has_state(pl_state_type.PST_SKILL_AVOID)) return false; if (from.iid != target.iid) { if (!skill_conf.skill_target_type_validation(aff, skill_aff_type.SAT_ENERMY)) { if (from.can_atk(target)) return false; if (from.isaily(target)) { if (!skill_conf.skill_target_type_validation(aff, skill_aff_type.SAT_ALLY)) return false; } else { if (!skill_conf.skill_target_type_validation(aff, skill_aff_type.SAT_MID)) return false; } } else { if (from.Is_Player()) { if (target.Is_Player()) { if (target.get_pack_data().in_pczone || from.get_pack_data().in_pczone) return false; if (!from.can_atk(target)) return false; } else if (target.Is_Monster()) { if (target.owner_ply != null) { if (target.owner_ply.iid == from.iid) return false; if (target.owner_ply.get_pack_data().in_pczone || from.get_pack_data().in_pczone) return false; if (!from.can_atk(target)) return false; } } } else { if (!from.can_atk(target)) return false; } } } else { if(!skill_conf.skill_target_type_validation(aff,skill_aff_type.SAT_SELF)) return false; } if (from.Is_Player()) { if(target.can_atk(from)) target.atk_by(from); } if (sk_res.nodmg == 0) { //TODO do damage } if (sk_res.rmv_stat > 0) rmv_stat_from_pl_by_gb(sk_res.rmv_stat,target); if(sk_res.rmv_1_stat >0) rmv_1_stat_from_pl_by_gb(sk_res.rmv_1_stat,target); if (sk_res.tar_state > 0) { IBaseUnit_State state = add_state_to_pl(now, target, sk_res, from, 100); } if (sk_res.force_move_dir != -1) { int dir = sk_res.force_move_dir; if (sk_res.force_move_dir == 2) dir = new Random().Next(0, 2); int delta_x = target.x - from.x; int delta_y = target.y - from.y; if (delta_x != 0 || delta_y != 0) { Point2D vec=new Point2D(delta_x,delta_y); vec = Utility.normalize_vec2(vec); delta_x = (int)(sk_res.force_move_rang*vec.x); delta_y = (int) (sk_res.force_move_rang*vec.y); if (sk_res.force_move_dir == 0) { target.x += delta_x; target.y += delta_y; } else { target.x -= delta_x; target.y -= delta_y; } } target.get_pack_data().moving = null; target.get_pack_data().casting = null; target.get_pack_data().last_mvpts = null; } return true; }
public static Variant apply_dmg_on_pl(IBaseUnit tar_sprite, IBaseUnit frm_sprite, damage damage, long cur_clock_tm, int per, bool direct_dmg = false) { // TO DO : 优化: per = 1000时不需要计算增益 //direct_dmg 非状态技能伤害 var tar_pl = tar_sprite.get_pack_data(); if (tar_pl == null) { return null; } if (tar_sprite.ignore_dmg()) { return null; } //::g_dump( " apply_dmg_on_pl() ===>>>>", "") ; //var ret = {hited=3, criatk=0, dmg=0, dobdmg=false, isdie=false, frm_iid=pl.iid, to_iid=tar_pl.iid}; var ret = apply_dmg_on_pl_ex(tar_sprite, frm_sprite, damage, cur_clock_tm, per, false, direct_dmg); if (ret["hited"]._int32 == 3) { // broadcast hpchange msg //var hpchange = { frm_iid = ret.frm_iid, hited = ret.hited, criatk = ret.criatk, dobdmg = ret.dobdmg }; // if (ret.dmg != 0) // { // hpchange.hpadd < - -ret.dmg; // hpchange.die < -ret.isdie; // } // if (("dp_dmg" in ret) && ret.dp_dmg != 0 ) //{ // hpchange.dpadd < - -ret.dp_dmg; // } // tar_sprite.broad_cast_zone_msg_and_self(26, { iid = tar_pl.iid, hpchange = hpchange}); } return ret; }