|
|
|
@ -9,6 +9,7 @@ import cc.hiver.mall.planet.service.PlanetNewsService; |
|
|
|
import cc.hiver.mall.planet.service.PlanetOperateService; |
|
|
|
import cc.hiver.mall.planet.service.PlanetTicketService; |
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
@ -78,10 +79,11 @@ public class PlanetOperateServiceImpl implements PlanetOperateService { |
|
|
|
state.setWarehouseLevel(1); |
|
|
|
state.setWarehouseCapacity(DEFAULT_WAREHOUSE_CAPACITY); |
|
|
|
state.setWarehouseTicketCount(0); |
|
|
|
final PlanetTowerLevelConfig towerLevel = getTowerLevel(regionId, 1); |
|
|
|
state.setTowerLevel(1); |
|
|
|
state.setTowerInterceptRate(BigDecimal.ZERO); |
|
|
|
state.setTowerDamage(0); |
|
|
|
state.setTowerCounterRate(BigDecimal.ZERO); |
|
|
|
state.setTowerInterceptRate(towerLevel == null ? BigDecimal.ZERO : towerLevel.getInterceptRate()); |
|
|
|
state.setTowerDamage(towerLevel == null ? 0 : towerLevel.getDamage()); |
|
|
|
state.setTowerCounterRate(towerLevel == null ? BigDecimal.ZERO : towerLevel.getCounterRate()); |
|
|
|
state.setDailySearchCount(0); |
|
|
|
state.setDailySearchGain(0); |
|
|
|
state.setDailyPlantGain(0); |
|
|
|
@ -181,7 +183,8 @@ public class PlanetOperateServiceImpl implements PlanetOperateService { |
|
|
|
@Override |
|
|
|
public List<PlanetTreeOrder> treeOrders(String userId, String regionId) { |
|
|
|
final LambdaQueryWrapper<PlanetTreeOrder> qw = new LambdaQueryWrapper<>(); |
|
|
|
qw.eq(PlanetTreeOrder::getUserId, userId).eq(PlanetTreeOrder::getRegionId, regionId).orderByDesc(PlanetTreeOrder::getCreateTime).last("limit 20"); |
|
|
|
qw.eq(PlanetTreeOrder::getUserId, userId).ne(PlanetTreeOrder::getStatus, PlanetConstant.TREE_STATUS_HARVESTED). |
|
|
|
eq(PlanetTreeOrder::getRegionId, regionId).orderByDesc(PlanetTreeOrder::getCreateTime).last("limit 20"); |
|
|
|
return treeOrderMapper.selectList(qw); |
|
|
|
} |
|
|
|
|
|
|
|
@ -296,12 +299,25 @@ public class PlanetOperateServiceImpl implements PlanetOperateService { |
|
|
|
boolean countered = false; |
|
|
|
int damage = 0; |
|
|
|
int gain = 0; |
|
|
|
int counterDrop = 0; |
|
|
|
final int beforePublicTickets = nullToZero(target.getTicketCount()); |
|
|
|
fromState.setStamina(nullToZero(fromState.getStamina()) - cost); |
|
|
|
if (intercepted) { |
|
|
|
countered = hit(targetState.getTowerCounterRate()); |
|
|
|
damage = countered ? nullToZero(targetState.getTowerDamage()) : Math.max(1, nullToZero(targetState.getTowerDamage()) / 2); |
|
|
|
fromState.setStamina(Math.max(0, nullToZero(fromState.getStamina()) - damage)); |
|
|
|
if (countered) { |
|
|
|
PlanetTicket fromTicket = ticketMapper.selectOne(new LambdaQueryWrapper<PlanetTicket>() |
|
|
|
.eq(PlanetTicket::getRegionId, regionId).eq(PlanetTicket::getUserId, userId).last("limit 1")); |
|
|
|
if (fromTicket != null && nullToZero(fromTicket.getTicketCount()) > 0) { |
|
|
|
counterDrop = 1; |
|
|
|
final String dropSourceId = genId(); |
|
|
|
ticketService.deductTickets(userId, regionId, counterDrop, PlanetConstant.TICKET_TYPE_SEARCH, |
|
|
|
dropSourceId + "_drop", "防御塔反击掉落"); |
|
|
|
ticketService.addTicketsWithoutBuff(target.getUserId(), regionId, counterDrop, PlanetConstant.TICKET_TYPE_SEARCH, |
|
|
|
dropSourceId + "_gain", "防御塔反击缴获"); |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
gain = calcSearchGain(config, beforePublicTickets, fromState); |
|
|
|
if (gain > 0) { |
|
|
|
@ -325,8 +341,9 @@ public class PlanetOperateServiceImpl implements PlanetOperateService { |
|
|
|
record.setCountered(countered ? 1 : 0); |
|
|
|
record.setStaminaDamage(damage); |
|
|
|
record.setGainTickets(gain); |
|
|
|
record.setCounterDropTickets(counterDrop); |
|
|
|
record.setTargetPublicTicketsBefore(beforePublicTickets); |
|
|
|
record.setMessage(intercepted ? "目标防御塔拦截了松鼠宇航员" : "搜查成功,获得星球券"); |
|
|
|
record.setMessage(buildSearchMessage(intercepted, countered, gain, counterDrop)); |
|
|
|
record.setCreateTime(new Date()); |
|
|
|
searchRecordMapper.insert(record); |
|
|
|
if (gain > 0) { |
|
|
|
@ -340,6 +357,7 @@ public class PlanetOperateServiceImpl implements PlanetOperateService { |
|
|
|
vo.setIntercepted(intercepted); |
|
|
|
vo.setCountered(countered); |
|
|
|
vo.setGainTickets(gain); |
|
|
|
vo.setCounterDropTickets(counterDrop); |
|
|
|
vo.setStaminaDamage(damage); |
|
|
|
vo.setRemainStamina(fromState.getStamina()); |
|
|
|
vo.setRemainSearchCount(Math.max(0, dailyLimit - nullToZero(fromState.getDailySearchCount()))); |
|
|
|
@ -347,6 +365,22 @@ public class PlanetOperateServiceImpl implements PlanetOperateService { |
|
|
|
return vo; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public Page<PlanetSearchRecord> raiders(String userId, String regionId, Integer pageNumber, Integer pageSize) { |
|
|
|
final int num = pageNumber == null || pageNumber <= 0 ? 1 : pageNumber; |
|
|
|
final int size = pageSize == null || pageSize <= 0 ? 10 : Math.min(pageSize, 50); |
|
|
|
final Page<PlanetSearchRecord> page = new Page<>(num, size); |
|
|
|
final LambdaQueryWrapper<PlanetSearchRecord> qw = new LambdaQueryWrapper<>(); |
|
|
|
qw.eq(PlanetSearchRecord::getToUserId, userId); |
|
|
|
if (StringUtils.isNotEmpty(regionId)) { |
|
|
|
qw.eq(PlanetSearchRecord::getRegionId, regionId); |
|
|
|
} |
|
|
|
qw.orderByDesc(PlanetSearchRecord::getCreateTime); |
|
|
|
final Page<PlanetSearchRecord> result = searchRecordMapper.selectPage(page, qw); |
|
|
|
fillSearchUserInfo(result.getRecords(), regionId); |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public List<PlanetStaminaItemConfig> staminaItems(String regionId) { |
|
|
|
final LambdaQueryWrapper<PlanetStaminaItemConfig> qw = new LambdaQueryWrapper<>(); |
|
|
|
@ -490,6 +524,52 @@ public class PlanetOperateServiceImpl implements PlanetOperateService { |
|
|
|
return list.get(new Random().nextInt(list.size())); |
|
|
|
} |
|
|
|
|
|
|
|
private void fillSearchUserInfo(List<PlanetSearchRecord> records, String regionId) { |
|
|
|
if (records == null || records.isEmpty()) { |
|
|
|
return; |
|
|
|
} |
|
|
|
final Map<String, PlanetTicket> users = new HashMap<>(); |
|
|
|
for (PlanetSearchRecord record : records) { |
|
|
|
putTicketUser(users, record.getFromUserId(), regionId); |
|
|
|
putTicketUser(users, record.getToUserId(), regionId); |
|
|
|
} |
|
|
|
for (PlanetSearchRecord record : records) { |
|
|
|
final PlanetTicket from = users.get(record.getFromUserId()); |
|
|
|
if (from != null) { |
|
|
|
record.setFromUserName(from.getNickname()); |
|
|
|
record.setFromAvatar(from.getAvatar()); |
|
|
|
} |
|
|
|
final PlanetTicket to = users.get(record.getToUserId()); |
|
|
|
if (to != null) { |
|
|
|
record.setToUserName(to.getNickname()); |
|
|
|
record.setToAvatar(to.getAvatar()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void putTicketUser(Map<String, PlanetTicket> users, String userId, String regionId) { |
|
|
|
if (StringUtils.isEmpty(userId) || users.containsKey(userId)) { |
|
|
|
return; |
|
|
|
} |
|
|
|
PlanetTicket ticket = ticketMapper.selectOne(new LambdaQueryWrapper<PlanetTicket>() |
|
|
|
.eq(PlanetTicket::getRegionId, regionId) |
|
|
|
.eq(PlanetTicket::getUserId, userId) |
|
|
|
.last("limit 1")); |
|
|
|
if (ticket != null) { |
|
|
|
users.put(userId, ticket); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private String buildSearchMessage(boolean intercepted, boolean countered, int gain, int counterDrop) { |
|
|
|
if (intercepted && countered) { |
|
|
|
return counterDrop > 0 ? "防御塔命中!掠夺者掉落 " + counterDrop + " 张星球券" : "防御塔命中!掠夺者空手而归"; |
|
|
|
} |
|
|
|
if (intercepted) { |
|
|
|
return "目标防御塔拦截了松鼠宇航员"; |
|
|
|
} |
|
|
|
return gain > 0 ? "搜查成功,获得 " + gain + " 张星球券" : "搜查成功,但目标没有可获得的星球券"; |
|
|
|
} |
|
|
|
|
|
|
|
private int calcSearchGain(PlanetSearchConfig config, int targetTicket, PlanetUserState fromState) { |
|
|
|
int min = config.getMinGain() == null ? 1 : config.getMinGain(); |
|
|
|
int max = config.getMaxGain() == null ? 3 : config.getMaxGain(); |
|
|
|
|