package com.ljsd.jieling.util; import rpc.protocols.CommonProto; import config.*; import manager.STableManager; import org.luaj.vm2.LuaTable; import org.luaj.vm2.LuaValue; import util.StringUtil; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class FightDataUtil { /** * 组装操作数据 * * @param data * @return */ public static LuaValue getOptionData(String data) { LuaValue LuaTable = new LuaTable(); LuaTable.set("uid",data); // LuaTable.set("enemyData", getEnemyData(monsterTeamList)); // // if (data.equals("") || data==null){ // return new LuaTable(); // } // String[] tempData1 = data.split("\\|"); // LuaValue tableA = new LuaTable(); // for (int i = 0; i < tempData1.length; i++) { // String[] tempData2 = tempData1[i].split("#"); // LuaValue tableB = new LuaTable(); // for (int j = 0; j < tempData2.length; j++) { // tableB.rawset(j + 1, LuaValue.valueOf(Integer.parseInt(tempData2[j]))); // } // tableA.rawset(i + 1, tableB); // } return LuaTable; } public static LuaValue getFinalFightData(CommonProto.FightTeamInfo heroTeam, List monsterTeamList) { LuaValue LuaTable = new LuaTable(); LuaTable.set("playerData", getPlayerData(heroTeam,0)); LuaTable.set("enemyData", getEnemyData(monsterTeamList)); return LuaTable; } public static LuaValue getFinalPlayerFightData(CommonProto.FightTeamInfo heroTeam, CommonProto.FightTeamInfo enemyHeroTeam) { return getFinalPlayerFightData(heroTeam,enemyHeroTeam,false); } public static LuaValue getFinalPlayerFightData(CommonProto.FightTeamInfo heroTeam, CommonProto.FightTeamInfo enemyHeroTeam,boolean firstCamp) { LuaValue LuaTable = new LuaTable(); LuaTable.set("playerData", getPlayerData(heroTeam,0)); LuaValue enemyData = new LuaTable(); enemyData.rawset( 1, getPlayerData(enemyHeroTeam,1,firstCamp)); LuaTable.set("enemyData", enemyData); return LuaTable; } public static LuaValue getEnemyData(List enemyDataList) { LuaValue enemyData = new LuaTable(); for (int i = 0; i < enemyDataList.size(); i++) { enemyData.rawset(i + 1, getMonsterFightUnit(enemyDataList.get(i))); } return enemyData; } private static LuaValue getMonsterFightUnit(CommonProto.FightTeamInfo data) { LuaValue enemyData = new LuaTable(); for (int i = 0; i < data.getFightUnitListCount(); i++) { CommonProto.FightUnitInfo unitInfo = data.getFightUnitList(i); String[] unitSkill = unitInfo.getUnitSkillIds().trim().split("#"); SMonsterConfig sMonster = STableManager.getConfig(SMonsterConfig.class).get(Integer.parseInt(unitInfo.getUnitId())); LuaValue unitData = new LuaTable(); unitData.set("roleId", sMonster.getMonsterId()); unitData.set("professionId", sMonster.getProfession()); unitData.set("camp", 1); unitData.set("type", sMonster.getType()); unitData.set("position",unitInfo.getPosition()); unitData.set("quality", sMonster.getQuality()); unitData.set("element",sMonster.getPropertyName()); unitData.set("skinId",sMonster.getSkinId()); SCHero hero = SCHero.getsCHero().get(sMonster.getMonsterId()); if(hero!=null){ unitData.set("job",hero.getJob()); unitData.set("star",hero.getStar()); } if (unitSkill.length==1){ unitData.set("skill", getSkill(unitSkill[0],sMonster.getSkinId())); unitData.set("superSkill", new LuaTable()); unitData.set("passivity", new LuaTable()); }else if (unitSkill.length==2){ unitData.set("skill", getSkill(unitSkill[0],sMonster.getSkinId())); unitData.set("superSkill", getSkill(unitSkill[1],sMonster.getSkinId())); unitData.set("passivity", new LuaTable()); }else { unitData.set("skill", getSkill(unitSkill[0],sMonster.getSkinId())); unitData.set("superSkill", getSkill(unitSkill[1],sMonster.getSkinId())); unitData.set("passivity", getPassivity(unitSkill)); } unitData.set("ai", getMonsterAi(sMonster.getMonsterAi())); CommonProto.FightUnitInfo fightUnitList = data.getFightUnitList(i); String property = fightUnitList.getProperty(); unitData.set("property", getMonsterProperty(property)); enemyData.rawset(i+1, unitData); } //todo 灵兽技能 enemyData.set("monsterList", getPokemonSkill(data.getPokemonUnitListList(),1)); enemyData.set("teamPassive", new LuaTable()); enemyData.set("teamSkill",new LuaTable()); return enemyData; } private static LuaValue getMonsterAi(int[] monsterAIs) { LuaValue property = new LuaTable(); int index =1; for(int monsterAI : monsterAIs){ property.rawset(index++, LuaValue.valueOf(monsterAI)); } return property; } private static LuaValue getPassivity(String[] unitSkill) { LuaValue passivityData = new LuaTable(); int length = unitSkill.length; if(length<3){ return passivityData; } int passivityIndex = 1; Set tempSet = new HashSet<>(8); for(int i=2;i effectList = parseArraayToLuaValues(sPassiveSkillLogicConfig.getValue()); int size = effectList.size(); if (size > 0) { for (int j = 0; j < size; j++) { detail.rawset(j + 4, effectList.get(j)); } } passivityData.rawset(passivityIndex,detail); passivityIndex++; } return passivityData; } private static List parseArraayToLuaValues(float[] source) { List result = new ArrayList<>(source.length); for(float id : source){ result.add(LuaValue.valueOf(id)); } return result; } /** * --属性 {等级,生命,最大生命,攻击力,护甲,魔抗,速度,伤害加成系数(%,伤害减免系数(%),命中率(%),闪避率(%),暴击率(%),暴击伤害系数(%),治疗加成系数(%) * -- ,火系伤害加成系数(%),火系伤害减免系数(%),冰系伤害加成系数(%),冰系伤害减免系数(%),雷系伤害加成系数(%),雷系伤害减免系数(%),风系伤害加成系数(%) * -- ,风系伤害减免系数(%),地系伤害加成系数(%),地系伤害减免系数(%),暗系伤害加成系数(%),暗系伤害减免系数(%)} * @return */ private static LuaValue getMonsterProperty(String propertyString) { LuaValue property = new LuaTable(); int index =1; for(String value : propertyString.split("#")){ property.rawset(index++, LuaValue.valueOf(value)); } return property; } public static LuaValue getPlayerData(CommonProto.FightTeamInfo heroTeam,int position) { return getPlayerData(heroTeam, position,false); } public static LuaValue getPlayerData(CommonProto.FightTeamInfo heroTeam,int position,boolean first) { LuaValue playerData = new LuaTable(); for (int i = 1; i <= heroTeam.getFightUnitListCount(); i++) { playerData.rawset(i, getHeroFightUnit(heroTeam.getFightUnitList(i - 1),position)); } playerData.set("teamSkill",new LuaTable()); playerData.set("teamPassive", getTeamPassive(heroTeam.getTeamPassiveList())); playerData.set("outData",heroTeam.getSpecialPassive()); // 灵兽技能 playerData.set("monsterList", getPokemonSkill(heroTeam.getPokemonUnitListList(),position)); playerData.set("firstCamp",first?1:0); return playerData; } private static LuaValue getTeamPassive(String pokemonSkill) { LuaValue passivityData = new LuaTable(); if (StringUtil.isEmpty(pokemonSkill)){ return passivityData; } String[] skills = pokemonSkill.trim().split("\\|"); for (int j = 0; j < skills.length; j++) { if (skills[j].length()>0){ String[] unitSkill = skills[j].split("#"); if(unitSkill.length==0){ continue; } LuaValue passivityDataPer= new LuaTable(); for(int i=0;i effectList = parseArraayToLuaValues(sPassiveSkillLogicConfig.getValue()); int size = effectList.size(); if (size > 0) { for (int t = 0; t < size; t++) { detail.rawset(t + 2, effectList.get(t)); } } passivityDataPer.rawset(i+1,detail); } passivityData.rawset(j+1,passivityDataPer); } } return passivityData; } //组装灵兽技能数据 camp=0 自己 1 对方 private static LuaValue getPokemonSkill(List pokemonUnitList, int camp) { LuaValue teamSkill = new LuaTable(); if (pokemonUnitList.isEmpty()){ return teamSkill; } for (int i = 0; i < pokemonUnitList.size(); i++) { CommonProto.FightUnitInfo unitInfo=pokemonUnitList.get(i); String skillId = unitInfo.getUnitSkillIds(); if(skillId.equals("0")|| StringUtil.isEmpty(skillId)){ continue; } ///100代表是修行技能 if (unitInfo.getPosition()==100){ LuaValue monster = new LuaTable(); monster.set("id",0); monster.set("star",unitInfo.getStar()); monster.set("teamDamage",unitInfo.getForceScore()); monster.set("camp",camp); monster.set("position",unitInfo.getPosition()); monster.set("property",getProperty(unitInfo.getProperty())); String[] skillIdArr = skillId.split("#"); LuaValue skillList= new LuaTable(); for (int k = 0; k < skillIdArr.length; k++) { SPlayerSkill playerSkillConfig=STableManager.getConfig(SPlayerSkill.class).get(Integer.valueOf(skillIdArr[k])); LuaValue skill= new LuaTable(); int[] skillIDList = playerSkillConfig.getSkillIDList(); for(int j = 0 ; j 0&&releaseLimit[0].length>0){ for(int l = 0 ; l 0 && releaseLimit[0].length > 0) { for (int l = 0; l < releaseLimit[j].length; l++) { triggerCondition.rawset(l + 1, LuaValue.valueOf(releaseLimit[j][l])); } } else { triggerCondition.rawset(1, LuaValue.valueOf(0)); } oneSkill.set("effect", getSkill(String.valueOf(skillIDList[j]), 0)); oneSkill.set("triggerCondition", triggerCondition); oneSkill.set("maxCount", sSpiritAnimalSkill.getWarEffectCount()[j]); oneSkill.set("maxRoundCount", sSpiritAnimalSkill.getTurnEffectCount()[j]); skill.rawset(j + 1, oneSkill); } skillList.rawset(k+1,skill); } monster.set("skill",skillList); // String[] skillAndPosItem = skillAndPos.split("#"); // if (Integer.parseInt(skillAndPosItem[1])>0){ // teamSkill.rawset(i + 1, getSkill(skillAndPosItem[1],skillAndPosItem[0])); // } teamSkill.rawset(i+1,monster); } } return teamSkill; } /** * * @param data * @param postion 0:我方 1:敌方 * @return */ private static LuaValue getHeroFightUnit(CommonProto.FightUnitInfo data,int postion) { String unitId = data.getUnitId(); String[] skillIds = data.getUnitSkillIds().trim().split("#"); String property = data.getProperty(); SCHero hero = SCHero.getsCHero().get(Integer.parseInt(unitId)); LuaValue unitData = new LuaTable(); unitData.set("roleId", hero.getId()); unitData.set("professionId", hero.getProfession()); unitData.set("camp", postion); unitData.set("type", 1); unitData.set("quality", 1); unitData.set("position", data.getPosition()); unitData.set("element", hero.getPropertyName()); unitData.set("skill", getSkill(skillIds[0],data.getSkinId())); if(skillIds.length == 1){ unitData.set("superSkill", getSkill(null,data.getSkinId())); }else { unitData.set("superSkill", getSkill(skillIds[1],data.getSkinId())); } unitData.set("passivity", getPassivity(skillIds)); unitData.set("property", getProperty(property)); unitData.set("skinId",data.getSkinId()); unitData.set("job",hero.getJob()); unitData.set("star",data.getStar()); return unitData; } private static LuaValue getProperty(String dataList) { String[] propertyArr = dataList.trim().split("#"); LuaValue property = new LuaTable(); for (int i = 1; i <= propertyArr.length; i++) { property.rawset(i, LuaValue.valueOf(Double.parseDouble(propertyArr[i-1]))); } return property; } private static LuaValue getSkill(String skillId,int skinId) { LuaValue skill = new LuaTable(); if (StringUtil.isEmpty(skillId)){ return skill; } SSkillLogicVo sSkillLogicVo = SSkillLogicConfig.getsSkillLogicVo(Integer.parseInt(skillId)); if (sSkillLogicVo != null && sSkillLogicVo.getSkillTargetVoList().size()>0) { // float cd = sSkillLogicVo.getCd(); // if(args!=null&&args.length>0){ // cd+=Integer.parseInt(args[0]); // } skill.rawset(1, LuaValue.valueOf(skillId)); int[][] display =sSkillLogicVo.getSkillDisplay(); int skillDisplay = display[0][0]; for(int[] skillArray:display){ if(skillArray[0]==skinId){ skillDisplay = skillArray[1]; break; } } SCombatControl sCombatControl = STableManager.getConfig(SCombatControl.class).get(skillDisplay); int KeyFrame = sCombatControl.getKeyFrame(); int SkillDuration = sCombatControl.getSkillDuration(); int SkillNumber = sCombatControl.getSkillNumber(); skill.rawset(2, LuaValue.valueOf(KeyFrame/1000f)); skill.rawset(3, LuaValue.valueOf(SkillDuration/1000f)); skill.rawset(4, LuaValue.valueOf(SkillNumber)); List effectList = getEffect(sSkillLogicVo); int size = effectList.size(); if (size > 0) { for (int i = 0; i < size; i++) { skill.rawset(i + 5, effectList.get(i)); } } } return skill; } private static List getEffect(SSkillLogicVo sSkillLogicVo) { List effectList = new ArrayList<>(); for (SkillTargetVo skillTargetVos : sSkillLogicVo.getSkillTargetVoList()) { LuaValue effect = new LuaTable(); effect.rawset(1, LuaValue.valueOf(skillTargetVos.getTargetId())); List effectValueList = getEffectArgs(skillTargetVos.getEffectVale()); int size = effectValueList.size(); if (size > 0) { for (int i = 0; i < size; i++) { effect.rawset(i + 2, effectValueList.get(i)); } } effectList.add(effect); } return effectList; } private static List getEffectArgs(float[][] effects) { List effectValueList = new ArrayList<>(); int sizeY = effects.length; if (sizeY > 0) { for (int i = 0; i < sizeY; i++) { int sizeX = effects[i].length; LuaValue effectValue = new LuaTable(); for (int j = 0; j < sizeX; j++) { effectValue.rawset(j + 1, LuaValue.valueOf(effects[i][j])); } effectValueList.add(effectValue); } } return effectValueList; } //==================================test data ================================= public static LuaValue getTestFightData() { LuaValue LuaTable = new LuaTable(); LuaTable.set("playerData", getTestPlayerData()); LuaTable.set("enemyData", getTestEnemyData()); return LuaTable; } private static LuaValue getTestEnemyData() { LuaValue playerDataMap = new LuaTable(); LuaValue playerData = new LuaTable(); for (int i = 1; i <= 5; i++) { playerData.rawset(i, getTestFightUnit(false)); } playerData.set("teamSkill", new LuaTable()); for (int i = 1; i <= 3; i++) { playerDataMap.rawset(i, playerData); } return playerDataMap; } private static LuaValue getTestFightUnit(boolean b) { LuaValue unitData = new LuaTable(); unitData.set("type", 1); unitData.set("quality", 1); unitData.set("skill", getTestSkill(true)); unitData.set("passivity", getTestSkill(false)); if (b) { unitData.set("roleId", 10001); unitData.set("professionId", 4); unitData.set("camp", 0); unitData.set("superSkill", getTestSkill(true)); unitData.set("property", getTestProperty(true)); } else { unitData.set("roleId", 1); unitData.set("professionId", 2); unitData.set("camp", 1); unitData.set("superSkill", getTestSkill(false)); unitData.set("property", getTestProperty(false)); } return unitData; } public static final Double[] propertyEm = new Double[]{ 1d, 144d, 144d, 285d, 152d, 53d, 154d, 0d, 0d, 0.7, 0.35, 0.3, 1.5, 1d, 0d, 0d, 0d, 0d, 0.05, 0d, 0d, 0d, 0d, 0d, 0.05, 0d }; public static final Double[] propertyHero = new Double[]{ 1d, 10000d, 10000d, 169d, 271d, 95d, 176d, 0d, 0d, 0.3, 0.15, 0.3, 1.5, 1d, 0.05, 0d, 0d, 0d, 0d, 0d, 0.05, 0d, 0d, 0d, 0d, 0d }; private static LuaValue getTestProperty(boolean isHero) { LuaValue property = new LuaTable(); if (isHero) { for (int i = 1; i <= propertyHero.length; i++) { property.rawset(i, LuaValue.valueOf(propertyHero[i - 1])); } } else { for (int i = 1; i <= propertyEm.length; i++) { property.rawset(i, LuaValue.valueOf(propertyEm[i - 1])); } } return property; } //"{1, 10000, 10000, 169, 271, 95, 176, 0, 0, 0.3, 0.15, 0.3, 1.5, 1, 0.05, 0, 0, 0, 0, 0, 0.05, 0, 0, 0, 0, 0}" //{ 0.5, {20011, 0.7,{1, 0.1, 1}}} private static LuaValue getTestSkill(boolean notNull) { LuaValue skill = new LuaTable(); if (notNull) { skill.rawset(1, LuaValue.valueOf(0.5)); skill.rawset(2, getTestEffect()); } return skill; } private static LuaValue getTestEffect() { LuaValue effect = new LuaTable(); effect.rawset(1, LuaValue.valueOf(20011)); effect.rawset(2, LuaValue.valueOf(0.7)); effect.rawset(3, getTestEffectArgs()); return effect; } private static LuaValue getTestEffectArgs() { LuaValue effectArgs = new LuaTable(); effectArgs.rawset(1, LuaValue.valueOf(1)); effectArgs.rawset(2, LuaValue.valueOf(0.1)); effectArgs.rawset(3, LuaValue.valueOf(1)); return effectArgs; } private static LuaValue getTestPlayerData() { LuaValue playerData = new LuaTable(); for (int i = 1; i <= 5; i++) { playerData.rawset(i, getTestFightUnit(true)); } playerData.set("teamSkill", new LuaTable()); return playerData; } }