suoha/libs/game_common/src/main/java/com/game/EventController.java

305 lines
8.6 KiB
Java
Raw Normal View History

2025-06-04 12:09:13 +08:00
package com.game;
import com.data.bean.GameBean;
import com.data.bean.GroupPlayBean;
import com.data.cache.GameCache;
import com.data.cache.GroupCache;
import com.data.cache.GroupMemberCache;
import com.data.util.ErrorCode;
import com.data.util.EventType;
import com.data.util.Utility;
import com.game.data.Player;
import com.game.data.Room;
import com.taurus.core.entity.ITObject;
import com.taurus.core.entity.TObject;
import com.taurus.core.plugin.redis.Redis;
import com.taurus.core.util.StringUtil;
import java.util.ArrayList;
/**
* redis
*/
public class EventController {
private final static String GROUP_EVT_KEY = "evt_group_";
private final static String EVT_KEY = "event_";
private final static String CHACHE_KEY = "group1_db8";
private final static String EVT_TYPE = "E";
private final static String EVT_GID = "gid";
private final static String EVT_UID = "uid";
private static void sendGroupEvt(int type, int gid, ITObject data) {
int id = gid % 10;
data.putInt(EVT_GID, gid);
data.putInt(EVT_TYPE, type);
Redis.use(CHACHE_KEY).lpush(GROUP_EVT_KEY + id, data.toJson());
}
private static void sendEvt(int type, int uid, ITObject data) {
int id = uid % 10;
data.putInt(EVT_UID, uid);
data.putInt(EVT_TYPE, type);
Redis.use(CHACHE_KEY).lpush(EVT_KEY + id, data.toJson());
}
/**
* redis
* @param uid
* @param type
* @param num
*/
public void redisEvent(int uid, int type, int num) {
ITObject data = TObject.newInstance();
data.putInt("N", num);
sendEvt(type, uid, data);
}
/**
*
* @param gid
* @param pid
* @param valid
*/
public void redisGroupRound(Room room, int gid, int pid, int valid) {
ITObject data = TObject.newInstance();
data.putInt("pid", pid);
data.putInt("valid", valid);
data.putTArray("player_list", room.getValidPlayerList());
data.putInt("perfect_round", room.endType == Constant.END_TYPE_NORMAL ? 1 : 0);
int maxPlayer = room.getValidPlayer();
if (valid == 1 && maxPlayer > 0) {
data.putInt("valid_count", 100 / maxPlayer);
} else {
data.putInt("valid_count", 0);
}
if (maxPlayer > 0)
{
data.putInt("all_count", 100 / maxPlayer);
}
try {
GroupPlayBean gpb = GroupCache.getPlay(gid, pid);
if (gpb != null) {
int maxPlayers = gpb.maxPlayers;
ITObject configData = TObject.newFromJsonData(gpb.config);
int opt = configData.getInt("opt");
int gameId = gpb.gameId;
GameBean gb = GameCache.getGame(gameId);
if (gb != null)
{
Integer pay = gb.pay.get("pay"+opt+"_"+maxPlayers);
if(pay != null && pay > 0 && maxPlayer > 0) {
data.putInt("valid_diamo", pay * 100 / maxPlayer);
}
}
}
}
catch(Exception e) {
Global.logger.error(e);
}
sendGroupEvt(EventType.REDIS_EVENT_GROUP_ROUND, gid, data);
}
/**
*
* @param owner
* @param pid
* @param win
*/
public void redisGroupMemberRound(Player owner, int pid, boolean win, boolean hpPump,int cur_hp) {
Room room = owner.room;
ITObject data = TObject.newInstance();
data.putInt("pid", pid);
data.putInt("uid", owner.playerid);
if (owner.hp != null) {
data.putInt("score", owner.hp.total_hp);
} else {
data.putInt("score", owner.score.total_score);
}
data.putInt("time", (int) (System.currentTimeMillis() / 1000));
data.putInt("pump", owner.practicalHpPump);
data.putInt("xi_pai_total", owner.xi_pai_total);
data.putInt("win", win ? 1 : 0);
data.putInt("perfect_round", owner.room.endType == Constant.END_TYPE_NORMAL ? 1 : 0);
data.putInt("cur_hp", cur_hp);
data.putUtfString("room", room.roomid);
int maxPlayer = owner.room.getValidPlayer();
if (hpPump && maxPlayer > 0) {
data.putInt("valid_count", 100 / maxPlayer);
} else {
data.putInt("valid_count", 0);
}
sendGroupEvt(EventType.REDIS_EVENT_GROUP_MEMBER_ROUND, owner.room.groupId, data);
}
/**
* redis reward
*/
public long redisFag(Player owner, int hp, boolean hpPump, boolean mengzhu_reward, int xipai_score, boolean xipai, String desc) {
Room room = owner.room;
String gm_key = GroupMemberCache.genKey(room.groupId, owner.playerid);
long cur_hp = 0;
if(hpPump) {
String strCurHp = Redis.use("group1_db10").hget(gm_key, "hp");
if (StringUtil.isNotEmpty(strCurHp))
{
cur_hp = Long.parseLong(strCurHp);
if (cur_hp < owner.practicalHpPump)
{
owner.practicalHpPump = (int)cur_hp;
if (owner.practicalHpPump < 0)
{
owner.practicalHpPump = 0;
}
}
}
cur_hp = Redis.use("group1_db10").hincrBy(gm_key, "hp", -owner.practicalHpPump);
}
else if (xipai) {
String strCurHp = Redis.use("group1_db10").hget(gm_key, "hp");
if (StringUtil.isNotEmpty(strCurHp))
{
cur_hp = Long.parseLong(strCurHp);
if (cur_hp < xipai_score)
{
xipai_score = (int)cur_hp;
if (xipai_score < 0)
{
xipai_score = 0;
}
}
}
cur_hp = Redis.use("group1_db10").hincrBy(gm_key, "hp", -xipai_score);
}
else {
cur_hp = Redis.use("group1_db10").hincrBy(gm_key, "hp", hp);
}
ITObject data = TObject.newInstance();
if (cur_hp > Integer.MAX_VALUE)
{
long del_value = cur_hp - (long)Integer.MAX_VALUE;
cur_hp = Redis.use("group1_db10").hincrBy(gm_key, "hp", -del_value);
Redis.use("group1_db10").hincrBy(gm_key, "bank_hp", del_value);
data.putInt("hp_than_max_value", (int)del_value);
}
data.putInt("hp", hp);
data.putInt("cur_hp", (int)cur_hp);
data.putInt("pid", room.groupPid);
data.putInt("uid", owner.playerid);
data.putInt("time", (int) (System.currentTimeMillis() / 1000));
data.putUtfString("room", room.roomid);
// 临时处理
data.putUtfString("desc", StringUtil.isNotEmpty(desc) ? desc : Global.gameName + " " + room.roomid);
data.putInt("rewardType", room.rewardType);
data.putInt("rewardValueType", room.rewardValueType);
data.putInt("xipai_rewardType", room.xipai_rewardType);
data.putInt("xipai_rewardValueType", room.xipai_rewardValueType);
if (xipai)
{
data.putInt("xipai", xipai_score);
int xipai_reward_value = 0;
if(room.xipai_rewardValueType == 1) {
xipai_reward_value = xipai_score;
}
data.putInt("max_player", room.maxPlayers);
data.putInt("xipai_reward_type", room.xipai_rewardType);
data.putInt("xipai_reward_value", xipai_reward_value);
if (StringUtil.isNotEmpty(owner.prs) && !mengzhu_reward) {
data.putUtfString("prs", owner.prs);
}
}
if (hpPump) {
data.putInt("pump", owner.practicalHpPump);
int reward_value = 0;
int max_player = room.getValidPlayer();
if(room.rewardValueType == 1) {
if(room.rewardType == 1) {
if(room.totalPump + room.basePump != 0) {
reward_value = owner.practicalHpPump - room.basePump * owner.practicalHpPump / (room.totalPump + room.basePump);
}
else {
reward_value = owner.practicalHpPump;
}
}else {
reward_value = room.totalPump / max_player;
if (room.basePump > 0)
{
if (reward_value + (room.basePump/max_player) > owner.practicalHpPump)
{
reward_value = owner.practicalHpPump - (room.basePump/max_player);
if (reward_value < 0)
{
reward_value = 0;
}
}
}
else {
if (reward_value > owner.practicalHpPump)
{
reward_value = owner.practicalHpPump;
}
}
}
}
data.putInt("max_player", room.getValidPlayer());
data.putInt("reward_type", room.rewardType);
data.putInt("reward_value", reward_value);
if (StringUtil.isNotEmpty(owner.prs) && !mengzhu_reward) {
data.putUtfString("prs", owner.prs);
}
}
sendGroupEvt(EventType.REDIS_EVENT_GROUP_HP, room.groupId, data);
return cur_hp;
}
/**
*
* @param uid
* @param pay
* @param groupId
*/
public void refundDiamo(int uid, int pay, int groupId, int pid) {
ITObject data = TObject.newInstance();
data.putInt("pay", -pay);
data.putInt("game", Global.gameId);
if (groupId > 0) {
data.putInt("group", groupId);
data.putInt("pid", pid);
}
sendEvt(EventType.REDIS_EVENT_BACK_PAY, uid, data);
}
/**
*
* @param gid
* @param pid
* @param valid
*/
public void redisOver(Player owner, int time, String rec_key) {
Room room = owner.room;
ITObject data = TObject.newInstance();
if (StringUtil.isNotEmpty(rec_key)) {
data.putInt("is_rec", 1);
data.putUtfString("roomid", room.roomid);
data.putInt("gid", room.groupId);
data.putUtfString("rec_key", rec_key);
data.putInt("time", time);
} else {
data.putInt("is_rec", 0);
}
sendEvt(EventType.REDIS_EVENT_OVER, owner.playerid, data);
}
}