异妖编队修改
parent
1c0cbabcad
commit
defb87c5da
|
@ -0,0 +1,27 @@
|
|||
package com.ljsd.jieling.handler;
|
||||
|
||||
import com.ljsd.jieling.logic.hero.HeroLogic;
|
||||
import com.ljsd.jieling.netty.cocdex.PacketNetData;
|
||||
import com.ljsd.jieling.network.session.ISession;
|
||||
import com.ljsd.jieling.protocols.CommonProto;
|
||||
import com.ljsd.jieling.protocols.HeroInfoProto;
|
||||
import com.ljsd.jieling.protocols.MessageTypeProto;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Component
|
||||
public class PokemonReplaceRequestHandler extends BaseHandler {
|
||||
@Override
|
||||
public MessageTypeProto.MessageType getMessageCode() {
|
||||
return MessageTypeProto.MessageType.POKEMON_REPLACE_REQUEST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(ISession iSession, PacketNetData netData) throws Exception {
|
||||
byte[] bytes = netData.parseClientProtoNetData();
|
||||
HeroInfoProto.ReplaceTeamPokemonInfoRequest replaceTeamPokemonInfoRequest = HeroInfoProto.ReplaceTeamPokemonInfoRequest.parseFrom(bytes);
|
||||
List<CommonProto.TeamPokemonInfo> teamPokemonInfosList = replaceTeamPokemonInfoRequest.getTeamPokemonInfosList();
|
||||
HeroLogic.getInstance().savePokemonTeam(iSession, teamPokemonInfosList);
|
||||
}
|
||||
}
|
|
@ -23,7 +23,6 @@ public class SaveTeamPosHandler extends BaseHandler{
|
|||
CommonProto.TeamPosInfo teamPosInfo = teamposSaveRequest.getTeamPosInfo();
|
||||
int teamId = teamPosInfo.getTeamId();
|
||||
List<CommonProto.TeamHeroInfo> teamHeroInfosList = teamPosInfo.getTeamHeroInfosList();
|
||||
List<CommonProto.TeamPokemonInfo> teamPokemonInfosList = teamPosInfo.getTeamPokemonInfosList();
|
||||
HeroLogic.getInstance().saveTeamPos(iSession,teamId,teamHeroInfosList,teamPokemonInfosList);
|
||||
HeroLogic.getInstance().saveTeamPos(iSession,teamId,teamHeroInfosList);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -223,14 +223,14 @@ public class Cmd_role_gm extends GmRoleAbstract {
|
|||
//玩家未激活异妖(神器)时,敌人阵容中不会出现异妖;激活异妖后,由敌人数据来源方决定战斗时是否有敌方异妖。
|
||||
String pokenmonSkills = HeroLogic.getInstance().getPokenmonSkills(user, snapTeamId);
|
||||
String pokenmonPassiveSkills = HeroLogic.getInstance().getPokenmonPassiveSkills(user, snapTeamId);
|
||||
List<TeamPosForPokenInfo> teamPosForPokenInfos = user.getTeamPosManager().getTeamPosForPoken().get(snapTeamId);
|
||||
if (null!=teamPosForPokenInfos) {
|
||||
List<Integer> pokens = new ArrayList<>();
|
||||
for (TeamPosForPokenInfo teamPosForPokenInfo : teamPosForPokenInfos) {
|
||||
pokens.add(teamPosForPokenInfo.getPokenId());
|
||||
}
|
||||
fightInfo.setPokenmonIds(pokens);
|
||||
}
|
||||
// List<TeamPosForPokenInfo> teamPosForPokenInfos = user.getTeamPosManager().getTeamPosForPoken().get(snapTeamId);
|
||||
// if (null!=teamPosForPokenInfos) {
|
||||
// List<Integer> pokens = new ArrayList<>();
|
||||
// for (TeamPosForPokenInfo teamPosForPokenInfo : teamPosForPokenInfos) {
|
||||
// pokens.add(teamPosForPokenInfo.getPokenId());
|
||||
// }
|
||||
// fightInfo.setPokenmonIds(pokens);
|
||||
// }
|
||||
fightInfo.setPokenmonSkills(pokenmonSkills);
|
||||
fightInfo.setPassiveSkills(pokenmonPassiveSkills);
|
||||
}
|
||||
|
|
|
@ -694,16 +694,6 @@ public class ChampionshipLogic {
|
|||
fightInfo.setPokenmonSkills(pokenmonSkills);
|
||||
String pokenmonPassiveSkills = HeroLogic.getInstance().getPokenmonPassiveSkills(user, snapTeamId);
|
||||
fightInfo.setPassiveSkills(pokenmonPassiveSkills);
|
||||
List<TeamPosForPokenInfo> teamPosForPokenInfos = user.getTeamPosManager().getTeamPosForPoken().get(snapTeamId);
|
||||
if (teamPosForPokenInfos != null) {
|
||||
List<Integer> pokens = new ArrayList<>();
|
||||
for (TeamPosForPokenInfo teamPosForPokenInfo : teamPosForPokenInfos) {
|
||||
pokens.add(teamPosForPokenInfo.getPokenId());
|
||||
}
|
||||
fightInfo.setPokenmonIds(pokens);
|
||||
}
|
||||
|
||||
|
||||
memberInfo.setFightInfo(fightInfo);
|
||||
joinMembers.put(memberInfo.getUid(), memberInfo);
|
||||
RedisUtil.getInstence().putMapEntry(RedisKey.CHAMPION_JOIN, "", String.valueOf(uid), memberInfo);
|
||||
|
|
|
@ -10,6 +10,9 @@ import java.util.Map;
|
|||
public class PokemonManager extends MongoBase {
|
||||
private Map<String,Pokemon> pokemonMap=new HashMap<>();
|
||||
|
||||
// 异妖编队
|
||||
private Map<Integer, String> pokemonTeamMap = new HashMap<>();
|
||||
|
||||
public PokemonManager() {
|
||||
this.setRootCollection(User._COLLECTION_NAME);
|
||||
}
|
||||
|
@ -31,6 +34,14 @@ public class PokemonManager extends MongoBase {
|
|||
|
||||
}
|
||||
|
||||
public Map<Integer, String> getPokemonTeamMap() {
|
||||
return pokemonTeamMap;
|
||||
}
|
||||
|
||||
public void updatePokemonTeamMap(Map<Integer, String> pokemonTeamMap){
|
||||
this.pokemonTeamMap = pokemonTeamMap;
|
||||
updateString("pokemonTeamMap", pokemonTeamMap);
|
||||
}
|
||||
|
||||
public Map<String, Pokemon> getPokemonMap() {
|
||||
return pokemonMap;
|
||||
|
|
|
@ -12,7 +12,6 @@ public class TeamPosManager extends MongoBase {
|
|||
|
||||
private Map<Integer, List<TeamPosHeroInfo>> teamPosForHero;
|
||||
private Map<Integer,String> teamNames;
|
||||
private Map<Integer,List<TeamPosForPokenInfo>> teamPosForPoken;
|
||||
@Transient
|
||||
private int curTeamPosId;
|
||||
@Transient
|
||||
|
@ -25,7 +24,6 @@ public class TeamPosManager extends MongoBase {
|
|||
|
||||
teamNames = new HashMap<>(3);
|
||||
teamPosForHero = new HashMap<>(3);
|
||||
teamPosForPoken = new HashMap<>(3);
|
||||
}
|
||||
|
||||
public void changeName(int teamId,String teamName) throws Exception {
|
||||
|
@ -33,21 +31,14 @@ public class TeamPosManager extends MongoBase {
|
|||
updateString("teamNames",teamNames);
|
||||
}
|
||||
|
||||
public void changeTeamInfo(int teamId, List<CommonProto.TeamHeroInfo> heroIds, List<CommonProto.TeamPokemonInfo> pokemonoIds) throws Exception {
|
||||
public void changeTeamInfo(int teamId, List<CommonProto.TeamHeroInfo> heroIds) throws Exception {
|
||||
List<TeamPosHeroInfo> teamPosHeroInfoList = new ArrayList<>(5);
|
||||
for(CommonProto.TeamHeroInfo teamHeroInfo : heroIds){
|
||||
TeamPosHeroInfo teamPosHeroInfo = new TeamPosHeroInfo(teamHeroInfo.getHeroId(), teamHeroInfo.getPosition());
|
||||
teamPosHeroInfoList.add(teamPosHeroInfo);
|
||||
}
|
||||
List<TeamPosForPokenInfo> teamPosForPokenInfos = new ArrayList<>(5);
|
||||
for(CommonProto.TeamPokemonInfo teamPokemonInfo : pokemonoIds){
|
||||
teamPosForPokenInfos.add(new TeamPosForPokenInfo(teamPokemonInfo.getPosition(),teamPokemonInfo.getPokemonId()));
|
||||
|
||||
}
|
||||
teamPosForHero.put(teamId,teamPosHeroInfoList);
|
||||
teamPosForPoken.put(teamId,teamPosForPokenInfos);
|
||||
updateString("teamPosForHero",teamPosForHero);
|
||||
updateString("teamPosForPoken",teamPosForPoken);
|
||||
cacheTeamPro.remove(teamId);
|
||||
|
||||
}
|
||||
|
@ -78,10 +69,6 @@ public class TeamPosManager extends MongoBase {
|
|||
return teamPosForHero;
|
||||
}
|
||||
|
||||
public Map<Integer, List<TeamPosForPokenInfo>> getTeamPosForPoken() {
|
||||
return teamPosForPoken;
|
||||
}
|
||||
|
||||
public int getCurTeamPosId() {
|
||||
return curTeamPosId;
|
||||
}
|
||||
|
|
|
@ -588,14 +588,6 @@ public class ExpeditionLogic {
|
|||
//玩家未激活异妖(神器)时,敌人阵容中不会出现异妖;激活异妖后,由敌人数据来源方决定战斗时是否有敌方异妖。
|
||||
String pokenmonSkills = HeroLogic.getInstance().getPokenmonSkills(user, snapTeamId);
|
||||
String pokenmonPassiveSkills = HeroLogic.getInstance().getPokenmonPassiveSkills(user, snapTeamId);
|
||||
List<TeamPosForPokenInfo> teamPosForPokenInfos = user.getTeamPosManager().getTeamPosForPoken().get(snapTeamId);
|
||||
if (null!=teamPosForPokenInfos) {
|
||||
List<Integer> pokens = new ArrayList<>();
|
||||
for (TeamPosForPokenInfo teamPosForPokenInfo : teamPosForPokenInfos) {
|
||||
pokens.add(teamPosForPokenInfo.getPokenId());
|
||||
}
|
||||
fightInfo.setPokenmonIds(pokens);
|
||||
}
|
||||
fightInfo.setPokenmonSkills(pokenmonSkills);
|
||||
fightInfo.setPassiveSkills(pokenmonPassiveSkills);
|
||||
}
|
||||
|
|
|
@ -158,11 +158,11 @@ public class GuildFightLogic {
|
|||
force = HeroLogic.getInstance().calTeamTotalForce(user, 1, false);
|
||||
}
|
||||
oneInfo.setTotalForce(force);
|
||||
if (teamPosManager.getTeamPosForPoken().get(1) != null && teamPosManager.getTeamPosForPoken().get(1).size() > 0) {
|
||||
for (TeamPosForPokenInfo posForPokenInfo : teamPosManager.getTeamPosForPoken().get(1)) {
|
||||
oneInfo.addPokemonInfos(posForPokenInfo.getPokenId());
|
||||
}
|
||||
}
|
||||
// if (teamPosManager.getTeamPosForPoken().get(1) != null && teamPosManager.getTeamPosForPoken().get(1).size() > 0) {
|
||||
// for (TeamPosForPokenInfo posForPokenInfo : teamPosManager.getTeamPosForPoken().get(1)) {
|
||||
// oneInfo.addPokemonInfos(posForPokenInfo.getPokenId());
|
||||
// }
|
||||
// }
|
||||
}
|
||||
Family.FamilyDefendDetailViewResponse.Builder response = Family.FamilyDefendDetailViewResponse.newBuilder();
|
||||
response.setTeamInfo(oneInfo);
|
||||
|
|
|
@ -572,7 +572,6 @@ public class HeroLogic{
|
|||
TeamPosManager teamPosManager = user.getTeamPosManager();
|
||||
Map<Integer, List<TeamPosHeroInfo>> teamPosForHero = teamPosManager.getTeamPosForHero();
|
||||
Map<Integer, String> teamNames = teamPosManager.getTeamNames();
|
||||
Map<Integer, List<TeamPosForPokenInfo>> teamPosForPoken = teamPosManager.getTeamPosForPoken();
|
||||
for(Map.Entry<Integer, List<TeamPosHeroInfo>> item :teamPosForHero.entrySet()){
|
||||
int teamId = item.getKey();
|
||||
List<TeamPosHeroInfo> teamPosHeroInfoList = item.getValue();
|
||||
|
@ -581,10 +580,6 @@ public class HeroLogic{
|
|||
// teamPosHeroInfoList = teamPosForHero.get(1);
|
||||
// }
|
||||
// }
|
||||
List<TeamPosForPokenInfo> teamPosForPokenInfos = teamPosForPoken.get(teamId);
|
||||
if(null == teamPosForPokenInfos){
|
||||
teamPosForPokenInfos = new ArrayList<>(1);
|
||||
}
|
||||
String teamName = teamNames.get(teamId);
|
||||
if(StringUtil.isEmpty(teamName)){
|
||||
teamName="";
|
||||
|
@ -595,16 +590,9 @@ public class HeroLogic{
|
|||
CommonProto.TeamHeroInfo.newBuilder().setPosition(teamPosHeroInfo.getPosition()).setHeroId(teamPosHeroInfo.getHeroId()).build()
|
||||
);
|
||||
}
|
||||
List<CommonProto.TeamPokemonInfo> pokemonInfoList = new ArrayList<>();
|
||||
for(TeamPosForPokenInfo teamPokemonInfo : teamPosForPokenInfos){
|
||||
pokemonInfoList.add(
|
||||
CommonProto.TeamPokemonInfo.newBuilder().setPokemonId(teamPokemonInfo.getPokenId()).setPosition(teamPokemonInfo.getPosition()).build()
|
||||
);
|
||||
}
|
||||
teamPosInfoList.add(
|
||||
CommonProto.TeamPosInfo.newBuilder()
|
||||
.addAllTeamHeroInfos(teamHeroInfoList)
|
||||
.addAllTeamPokemonInfos(pokemonInfoList)
|
||||
.setTeamName(teamName)
|
||||
.setTeamId(teamId)
|
||||
.build()
|
||||
|
@ -614,7 +602,7 @@ public class HeroLogic{
|
|||
MessageUtil.sendMessage(session,1,MessageTypeProto.MessageType.GET_TEAMPOS_INFO_RESPONSE_VALUE,build,true);
|
||||
}
|
||||
|
||||
public void saveTeamPos(ISession iSession, int teamId, List<CommonProto.TeamHeroInfo> heroIds , List<CommonProto.TeamPokemonInfo> pokemonoIds) throws Exception {
|
||||
public void saveTeamPos(ISession iSession, int teamId, List<CommonProto.TeamHeroInfo> heroIds) throws Exception {
|
||||
User user = UserManager.getUser(iSession.getUid());
|
||||
HeroManager heroManager = user.getHeroManager();
|
||||
Set<Integer> set = new HashSet<>();
|
||||
|
@ -641,11 +629,11 @@ public class HeroLogic{
|
|||
if(set.size()!=heroIds.size()){
|
||||
throw new ErrorCodeException(ErrorCode.NO_USE_SAME_HERO);
|
||||
}
|
||||
String err = checkTeamPos(user, teamId,heroIds,pokemonoIds);
|
||||
String err = checkTeamPos(user, teamId,heroIds);
|
||||
if(!"".equals(err)){
|
||||
throw new ErrorCodeException(ErrorCode.newDefineCode(err));
|
||||
}
|
||||
user.getTeamPosManager().changeTeamInfo(teamId,heroIds,pokemonoIds);
|
||||
user.getTeamPosManager().changeTeamInfo(teamId,heroIds);
|
||||
//401图内可以更改编队
|
||||
if(teamId == GlobalsDef.ENDLESS_TEAM){
|
||||
List<TeamPosHeroInfo> teamPosHeroInfos = user.getTeamPosManager().getTeamPosForHero().get(teamId);
|
||||
|
@ -682,7 +670,7 @@ public class HeroLogic{
|
|||
MessageUtil.sendIndicationMessage(iSession,1, MessageTypeProto.MessageType.ENDLESS_MAP_SET_TEAM_INDICATION_VALUE,response,true);
|
||||
}
|
||||
}else{
|
||||
user.getTeamPosManager().changeTeamInfo(teamId,heroIds,pokemonoIds);
|
||||
user.getTeamPosManager().changeTeamInfo(teamId,heroIds);
|
||||
}
|
||||
|
||||
|
||||
|
@ -700,7 +688,31 @@ public class HeroLogic{
|
|||
MessageUtil.sendMessage(iSession,1,MessageTypeProto.MessageType.TEAM_POS_SAVE_RESPONSE_VALUE,null,true);
|
||||
}
|
||||
|
||||
public String checkTeamPos(User user, int teamId,List<CommonProto.TeamHeroInfo> heroIds, List<CommonProto.TeamPokemonInfo> pokemonoIds ){
|
||||
/**
|
||||
* 保存异妖阵容
|
||||
* @param session
|
||||
* @param teamPokemonInfos
|
||||
*/
|
||||
public void savePokemonTeam(ISession session, List<CommonProto.TeamPokemonInfo> teamPokemonInfos) throws Exception {
|
||||
if (teamPokemonInfos == null || teamPokemonInfos.isEmpty()) {
|
||||
LOGGER.info("savePokemonTeam uid=>{} , teamPokemonInfos isEmpty", session.getUid());
|
||||
throw new ErrorCodeException(ErrorCode.newDefineCode("Pokemon null"));
|
||||
}
|
||||
User user = UserManager.getUser(session.getUid());
|
||||
Map<String, Pokemon> pokemonMap = user.getPokemonManager().getPokemonMap();
|
||||
Map<Integer, String> pokemonTeamMap = new HashMap<>();
|
||||
for (CommonProto.TeamPokemonInfo teamPokemonInfo : teamPokemonInfos) {
|
||||
if (!pokemonMap.containsKey(teamPokemonInfo.getPokemonId())) {
|
||||
LOGGER.info("savePokemonTeam uid=>{} , pokemon non-existent id=>{}", user.getId(), teamPokemonInfo.getPokemonId());
|
||||
throw new ErrorCodeException(ErrorCode.newDefineCode("Pokemon null"));
|
||||
}
|
||||
pokemonTeamMap.put(teamPokemonInfo.getPosition(), teamPokemonInfo.getPokemonId());
|
||||
}
|
||||
user.getPokemonManager().updatePokemonTeamMap(pokemonTeamMap);
|
||||
MessageUtil.sendMessage(session, 1, MessageTypeProto.MessageType.POKEMON_REPLACE_RESPONSE.getNumber(), null);
|
||||
}
|
||||
|
||||
public String checkTeamPos(User user, int teamId,List<CommonProto.TeamHeroInfo> heroIds){
|
||||
if(heroIds ==null || heroIds.isEmpty()){
|
||||
return "";
|
||||
}
|
||||
|
@ -743,34 +755,10 @@ public class HeroLogic{
|
|||
// return "no active";
|
||||
// }
|
||||
// }
|
||||
int size = pokemonoIds.size();
|
||||
// boolean allowed = user.getPlayerInfoManager().checkAndUpdate(VipPrivilegeType.POKEMON_NUM, size);
|
||||
boolean allowed =checkPokeManPos(user,size);
|
||||
if(!allowed){
|
||||
return "now allowd";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
private boolean checkPokeManPos(User user ,int size){
|
||||
int[][] differLocation = STableManager.getFigureConfig(CommonStaticConfig.class).getGameSetting().getDifferLocation();
|
||||
for(int i=0;i<size;i++){
|
||||
int[] condition = differLocation[i];
|
||||
switch (condition[0]){
|
||||
case 1:
|
||||
if(!MissionLoigc.checkMainLevel(user, condition[1])){
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(user.getPlayerInfoManager().getLevel()<condition[1]){
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void upHeroLevel(ISession session,String heroId,int targetLevel) throws Exception {
|
||||
User user = UserManager.getUser(session.getUid());
|
||||
|
@ -1333,10 +1321,6 @@ public class HeroLogic{
|
|||
|
||||
public String getPokenmonSkills(User user,int teamId){
|
||||
StringBuilder pokenSkillResult = new StringBuilder();
|
||||
List<TeamPosForPokenInfo> teamPosForPokenInfos = user.getTeamPosManager().getTeamPosForPoken().get(teamId);
|
||||
if (teamPosForPokenInfos==null || teamPosForPokenInfos.isEmpty()){
|
||||
return "";
|
||||
}
|
||||
//todo 灵兽
|
||||
// Map<Integer, Pokemon> pokemonMap = user.getPokemonManager().getPokemonMap();
|
||||
// Collections.sort(teamPosForPokenInfos);
|
||||
|
@ -1357,10 +1341,6 @@ public class HeroLogic{
|
|||
|
||||
public String getPokenmonPassiveSkills(User user,int teamId){
|
||||
StringBuilder pokenSkillResult = new StringBuilder();
|
||||
List<TeamPosForPokenInfo> teamPosForPokenInfos = user.getTeamPosManager().getTeamPosForPoken().get(teamId);
|
||||
if (teamPosForPokenInfos==null){
|
||||
return "";
|
||||
}
|
||||
//todo 灵兽
|
||||
// Map<Integer, Pokemon> pokemonMap = user.getPokemonManager().getPokemonMap();
|
||||
// Collections.sort(teamPosForPokenInfos);
|
||||
|
@ -2138,8 +2118,17 @@ public class HeroLogic{
|
|||
for(Pokemon pokemon : pokemonMap.values()){
|
||||
pokemonInfoList.add(CBean2Proto.getPokemon(pokemon));
|
||||
}
|
||||
|
||||
HeroInfoProto.GetAllPokemonResponse build = HeroInfoProto.GetAllPokemonResponse.newBuilder().addAllPokemonInfo(pokemonInfoList).build();
|
||||
List<CommonProto.TeamPokemonInfo> teamPokemonInfos = new ArrayList<>();
|
||||
for (Map.Entry<Integer, String> entry : pokemonManager.getPokemonTeamMap().entrySet()) {
|
||||
CommonProto.TeamPokemonInfo teamPokemonInfo = CommonProto.TeamPokemonInfo.newBuilder()
|
||||
.setPokemonId(entry.getValue())
|
||||
.setPosition(entry.getKey())
|
||||
.build();
|
||||
teamPokemonInfos.add(teamPokemonInfo);
|
||||
}
|
||||
HeroInfoProto.GetAllPokemonResponse build = HeroInfoProto.GetAllPokemonResponse.newBuilder().addAllPokemonInfo(pokemonInfoList)
|
||||
.addAllTeamPokemonInfos(teamPokemonInfos)
|
||||
.build();
|
||||
MessageUtil.sendMessage(iSession,1,MessageTypeProto.MessageType.GET_ALL_POKEMON_RESPONSE_VALUE,build,true);
|
||||
}
|
||||
|
||||
|
|
|
@ -556,11 +556,6 @@ public class PlayerLogic {
|
|||
TeamPosManager teamPosManager = user.getTeamPosManager();
|
||||
CommonProto.TeamOneTeamInfo.Builder teamInfo = CommonProto.TeamOneTeamInfo.newBuilder();
|
||||
teamInfo.setTotalForce(HeroLogic.getInstance().calTeamTotalForce(user,teamId,false));
|
||||
if(teamPosManager.getTeamPosForPoken().get(teamId)!=null&&teamPosManager.getTeamPosForPoken().get(teamId).size()>0){
|
||||
for(TeamPosForPokenInfo posForPokenInfo:teamPosManager.getTeamPosForPoken().get(teamId)){
|
||||
teamInfo.addPokemonInfos(posForPokenInfo.getPokenId());
|
||||
}
|
||||
}
|
||||
if(teamPosManager.getTeamPosForHero().containsKey(teamId)){
|
||||
for (TeamPosHeroInfo heroInfo:teamPosManager.getTeamPosForHero().get(teamId)) {
|
||||
Hero hero = user.getHeroManager().getHero(heroInfo.getHeroId());
|
||||
|
|
Loading…
Reference in New Issue