//--------------------------------------------------------------------- void longFire(float elapsed_tm) { mfTotalSecond += elapsed_tm; if (mfTotalSecond - mfLastFireSecond > mfFireTimeSpan) { mfLastFireSecond = mfTotalSecond; float random = getRandom01(); if (random < 0.1f) { mTurret.c2sEndLongpress(); change2observeState(); } int cur_gold = mScene.getListener().onLogicSceneGetPlayerGold(mTurret.getScenePlayerInfo().et_player_rpcid); if (cur_gold < mTurret.getTurretRate()) { mTurret.c2sEndLongpress(); change2observeState(); return; } else { autoFire(); } } }
//--------------------------------------------------------------------- // 计算鱼死亡分值并更新玩家状态 void _calculateFishScore(uint et_player_rpcid, CLogicTurret turret, CLogicFish fish, int rate, int bullet_objid) { // 计算鱼的死亡概率,鱼死亡则销毁 int score = 1;// 分值 int effect_fish_vib_id = -1; bool fish_die = fish.hit(et_player_rpcid, rate, ref score, ref effect_fish_vib_id); if (fish_die) { // 奖励金币 if (turret.getBufferPower()) { rate *= 2; } int total_score = rate * score; _tScenePlayer player = turret.getScenePlayerInfo(); int cur_gold = mScene.getListener().onLogicSceneGetPlayerGold(player.et_player_rpcid); cur_gold += total_score; mScene.getListener().onLogicSceneSetPlayerGold(player.et_player_rpcid, cur_gold, fish.FishVibId, "FishLord", rate); // 通知其他模块鱼死亡 mScene.getListener().onLogicSceneFishDie(et_player_rpcid, fish.FishVibId, total_score); // 服务端广播鱼死亡 mScene.getProtocol().s2allcFishDie(et_player_rpcid, total_score, bullet_objid, fish.FishObjId, effect_fish_vib_id, rate); } }
//--------------------------------------------------------------------- // 服务端广播玩家进入 public void s2allcPlayerEnter(CLogicTurret turret) { List <string> vec_param = new List <string>(); vec_param.Add(((byte)_eProtocolDesktop.s2allcPlayerEnter).ToString()); _tScenePlayer scene_player = turret.getScenePlayerInfo(); vec_param.Add(scene_player.et_player_rpcid.ToString()); vec_param.Add(scene_player.nickname); int player_gold = mScene.getListener().onLogicSceneGetPlayerGold(scene_player.et_player_rpcid); vec_param.Add(player_gold.ToString()); vec_param.Add(scene_player.rate.ToString()); vec_param.Add(turret.getTurretId().ToString()); vec_param.Add(turret.getBufferPower().ToString()); vec_param.Add(turret.getBufferFreeze().ToString()); vec_param.Add(turret.getBufferLongpress().ToString()); vec_param.Add(turret.getBufferRapid().ToString()); vec_param.Add(turret.getTurretAngle().ToString()); vec_param.Add(turret.getTurretRate().ToString()); vec_param.Add(turret.getTurretType().ToString()); vec_param.Add(turret.getLockFishObjId().ToString()); mQueProtocol.Enqueue(vec_param); }
//------------------------------------------------------------------------- // 被击中,返回是否鱼死亡 public bool hit(uint et_player_rpcid, int bullet_rate, ref int score, ref int effect_fish_vib_id) { if (IsDie) { return(false); // 死鱼是打不死的 } double random_double = mScene.getLevel().getRandomScore(); double die_chance = 1.0; // 鱼自身概率 if (mFishData.FishDieChance >= 0) { die_chance = 1.0 / (double)mFishData.FishDieChance; } // 系统抽水率+玩家动态概率提升 CLogicTurret turret = mScene.getTurret(et_player_rpcid); if (turret != null) { die_chance *= mScene.getPumpingRate() * turret.getScenePlayerInfo().rate; } if (mScene.isFishMustDie()) { // 调试需要,鱼必死 } else if (random_double > die_chance) { // 根据概率计算,鱼不一定死 return(false); } // 使用固定分值 score = mFishData.FishScore; // 极速发炮时命中鱼后有一定概率获得能量炮状态 if (turret != null && turret.getBufferRapid()) { if (mScene.getLevel().getRandoNumber(0, 10000) < 50) { turret.activeBufferPower(); } } // 需要在特效参数前加入销毁列表,aoe会根据这个列表判断鱼是不是已经死了死了就不计算。 signDestroy(); foreach (var it in mFishData.Effects) { int vib_compose_id = it.Id; if (vib_compose_id > 0) { Dictionary <string, object> param = new Dictionary <string, object>(); param.Add("SourcePosition", mMassEntity.Position); param.Add("PlayerID", et_player_rpcid); param.Add("BulletRate", bullet_rate); param.Add("RedFishObjId", mFishObjId); param.Add("DieFishObjId", mFishObjId); List <List <object> > obj = mScene.addEffect(vib_compose_id, param, EffectTypeEnum.Server); if (obj == null) { continue; } foreach (var l in obj) { if (l.Count == 0) { continue; } string effect_name = (string)l[0]; if (effect_name == "Lighting") { score += (int)l[1]; effect_fish_vib_id = (int)l[2]; } else if (effect_name == "FullScreenBomb") { score += (int)l[1]; } else if (effect_name == "EffectAOE") { score += (int)l[1]; } } } } return(true); }