MXD-Server/src/handling/channel/handler/BeanGame.java

502 lines
26 KiB
Java

package handling.channel.handler;
import java.util.List;
import client.MapleCharacter;
import client.MapleBeans;
import tools.FileoutputUtil;
import constants.GameConstants;
import server.Randomizer;
import tools.MaplePacketCreator;
import java.util.ArrayList;
import constants.BeansConstants;
import client.MapleClient;
import tools.data.LittleEndianAccessor;
public class BeanGame {
public static int 进洞次数;
public static int 第一排;
public static int 第三排;
public static int 第二排;
public static int 启动打怪效果;
public static int 中奖率;
public static int 加速旋转;
public static boolean 打中女皇出现特效A;
public static boolean 打中女皇出现特效B;
public static int ;
public static int 绿;
public static int ;
public static int 黄金狗设置局数;
public static final void BeansGameAction(final LittleEndianAccessor slea, final MapleClient c) {
final BeansConstants Beans = new BeansConstants();
final int 海洋帽子机率 = Beans.get海洋帽子机率();
final int 力度搞假 = Beans.get力度搞假();
final int 豆豆奖励范围 = Beans.get豆豆奖励范围();
final String[] 黄金狗机率 = Beans.get黄金狗机率();
final String[] 大白怪 = Beans.get大白怪();
final String[] 小白怪 = Beans.get小白怪();
final String[] 紫色怪 = Beans.get紫色怪();
final String[] 粉色怪 = Beans.get粉色怪();
final String[] 飞侠 = Beans.get飞俠();
final String[] 海盗 = Beans.get海盜();
final String[] 魔法师 = Beans.get魔法师();
final String[] 战士 = Beans.get战士();
final String[] 弓箭手 = Beans.get弓箭手();
final String[] 女皇 = Beans.get女皇();
final String[] 白怪奖励 = Beans.get白怪奖励();
final String[] 色怪奖励 = Beans.get色怪奖励();
final String[] 五职业奖励 = Beans.get五职业奖励();
final String[] 女皇奖励 = Beans.get女皇奖励();
final MapleCharacter chr = c.getPlayer();
final List<MapleBeans> beansInfo = (List<MapleBeans>) new ArrayList();
final int type = slea.readByte();
int 力度 = 0;
int 豆豆序号 = 0;
if (chr.getBeans() <= 0) {
c.getPlayer().dropMessage(1, "你沒有小钢珠,无法使用。");
c.sendPacket(MaplePacketCreator.enableActions());
return;
}
switch (type) {
case 0: {
slea.readShort();
力度 = Randomizer.rand(1000, 5000);
chr.setBeansRange(力度);
c.getSession().write(MaplePacketCreator.enableActions());
break;
}
case 1: {
chr.setBeansRange(力度);
c.getSession().write(MaplePacketCreator.enableActions());
break;
}
case 2: {
if (get进洞次数() > 1) {
set进洞次数(0);
break;
}
set进洞次数(0);
break;
}
case 3: {
gain进洞次数(1);
if (get进洞次数() > 7) {
set进洞次数(7);
}
c.getSession().write(MaplePacketCreator.BeansJDCS(get进洞次数(), BeanGame.加速旋转, BeanGame., BeanGame.绿, BeanGame.));
break;
}
case 4: {
if (get进洞次数() == 0) {
c.sendPacket(MaplePacketCreator.enableActions());
return;
}
gain进洞次数(-1);
int 概率 = 0;
if (BeanGame.黄金狗设置局数 > 0) {
概率 = 100;
}
if (Randomizer.nextInt(Integer.parseInt(大白怪[0])) > Integer.parseInt(大白怪[1]) && 概率 != 100) {
BeanGame.第一排 = 0;
BeanGame.第三排 = 0;
if (Randomizer.nextInt(Integer.parseInt(大白怪[2])) > Integer.parseInt(大白怪[3])) {
BeanGame.第二排 = 0;
BeanGame.中奖率 = 100;
} else {
BeanGame.中奖率 = 0;
}
BeanGame.启动打怪效果 = 1;
BeanGame.打中女皇出现特效A = false;
BeanGame.打中女皇出现特效B = false;
} else if (Randomizer.nextInt(Integer.parseInt(紫色怪[0])) > Integer.parseInt(紫色怪[1]) && 概率 != 100) {
BeanGame.第一排 = 9;
BeanGame.第三排 = 7;
if (Randomizer.nextInt(Integer.parseInt(紫色怪[2])) > Integer.parseInt(紫色怪[3])) {
BeanGame.第二排 = 1;
BeanGame.中奖率 = 100;
} else {
BeanGame.中奖率 = 0;
}
BeanGame.启动打怪效果 = 1;
BeanGame.打中女皇出现特效A = false;
BeanGame.打中女皇出现特效B = false;
} else if (Randomizer.nextInt(Integer.parseInt(粉色怪[0])) > Integer.parseInt(粉色怪[1]) && 概率 != 100) {
BeanGame.第一排 = 1;
BeanGame.第三排 = 2;
if (Randomizer.nextInt(Integer.parseInt(粉色怪[2])) > Integer.parseInt(粉色怪[3])) {
BeanGame.第二排 = 3;
BeanGame.中奖率 = 100;
} else {
BeanGame.中奖率 = 0;
}
BeanGame.启动打怪效果 = 1;
BeanGame.打中女皇出现特效A = false;
BeanGame.打中女皇出现特效B = false;
} else if (Randomizer.nextInt(Integer.parseInt(小白怪[0])) > Integer.parseInt(小白怪[1]) && 概率 != 100) {
BeanGame.第一排 = 5;
BeanGame.第三排 = 1;
if (Randomizer.nextInt(Integer.parseInt(小白怪[2])) > Integer.parseInt(小白怪[3])) {
BeanGame.第二排 = 5;
BeanGame.中奖率 = 100;
} else {
BeanGame.中奖率 = 0;
}
BeanGame.启动打怪效果 = 1;
BeanGame.打中女皇出现特效A = false;
BeanGame.打中女皇出现特效B = false;
} else if (Randomizer.nextInt(Integer.parseInt(飞侠[0])) > Integer.parseInt(飞侠[1]) && 概率 != 100) {
BeanGame.第一排 = 4;
BeanGame.第三排 = 9;
if (Randomizer.nextInt(Integer.parseInt(飞侠[2])) > Integer.parseInt(飞侠[3])) {
BeanGame.第二排 = 2;
BeanGame.中奖率 = 100;
} else {
BeanGame.中奖率 = 0;
}
BeanGame.启动打怪效果 = 1;
BeanGame.打中女皇出现特效A = false;
BeanGame.打中女皇出现特效B = false;
} else if (Randomizer.nextInt(Integer.parseInt(海盗[0])) > Integer.parseInt(海盗[1]) && 概率 != 100) {
BeanGame.第一排 = 7;
BeanGame.第三排 = 5;
if (Randomizer.nextInt(Integer.parseInt(海盗[2])) > Integer.parseInt(海盗[3])) {
BeanGame.第二排 = 4;
BeanGame.中奖率 = 100;
} else {
BeanGame.中奖率 = 0;
}
BeanGame.启动打怪效果 = 1;
BeanGame.打中女皇出现特效A = false;
BeanGame.打中女皇出现特效B = false;
} else if (Randomizer.nextInt(Integer.parseInt(魔法师[0])) > Integer.parseInt(魔法师[1]) && 概率 != 100) {
BeanGame.第一排 = 2;
BeanGame.第三排 = 4;
if (Randomizer.nextInt(Integer.parseInt(魔法师[2])) > Integer.parseInt(魔法师[3])) {
BeanGame.第二排 = 6;
BeanGame.中奖率 = 100;
} else {
BeanGame.中奖率 = 0;
}
BeanGame.启动打怪效果 = 1;
BeanGame.打中女皇出现特效A = false;
BeanGame.打中女皇出现特效B = false;
} else if (Randomizer.nextInt(Integer.parseInt(战士[0])) > Integer.parseInt(战士[1]) && 概率 != 100) {
BeanGame.第一排 = 8;
BeanGame.第三排 = 8;
if (Randomizer.nextInt(Integer.parseInt(战士[2])) > Integer.parseInt(战士[3])) {
BeanGame.第二排 = 7;
BeanGame.中奖率 = 100;
} else {
BeanGame.中奖率 = 0;
}
BeanGame.启动打怪效果 = 1;
BeanGame.打中女皇出现特效A = false;
BeanGame.打中女皇出现特效B = false;
} else if (Randomizer.nextInt(Integer.parseInt(弓箭手[0])) > Integer.parseInt(弓箭手[1]) && 概率 != 100) {
BeanGame.第一排 = 6;
BeanGame.第三排 = 3;
if (Randomizer.nextInt(Integer.parseInt(弓箭手[2])) > Integer.parseInt(弓箭手[3])) {
BeanGame.第二排 = 8;
BeanGame.中奖率 = 100;
} else {
BeanGame.中奖率 = 0;
}
BeanGame.启动打怪效果 = 1;
BeanGame.打中女皇出现特效A = false;
BeanGame.打中女皇出现特效B = false;
} else if (Randomizer.nextInt(Integer.parseInt(女皇[0])) > Integer.parseInt(女皇[1]) || 概率 == 100) {
BeanGame.第一排 = 3;
BeanGame.第三排 = 6;
if (BeanGame.黄金狗设置局数 > 0) {
BeanGame.第二排 = 9;
BeanGame.中奖率 = 100;
BeanGame.黄金狗设置局数 = 0;
} else if (Randomizer.nextInt(Integer.parseInt(女皇[2])) > Integer.parseInt(女皇[3])) {
BeanGame.第二排 = 9;
BeanGame.中奖率 = 100;
} else {
BeanGame.中奖率 = 0;
}
BeanGame.启动打怪效果 = 1;
BeanGame.打中女皇出现特效A = false;
BeanGame.打中女皇出现特效B = false;
} else {
switch (BeanGame.第一排 = Randomizer.nextInt(10)) {
case 0: {
BeanGame.第三排 = Randomizer.nextInt(9) + 1;
break;
}
case 1: {
BeanGame.第三排 = Randomizer.nextInt(7) + 3;
break;
}
case 2: {
BeanGame.第三排 = Randomizer.nextInt(5) + 5;
break;
}
case 3: {
BeanGame.第三排 = Randomizer.nextInt(3) + 7;
break;
}
case 4: {
BeanGame.第三排 = Randomizer.nextInt(9);
break;
}
case 5: {
BeanGame.第三排 = Randomizer.nextInt(8) + 2;
break;
}
case 6: {
BeanGame.第三排 = Randomizer.nextInt(6) + 4;
break;
}
case 7: {
BeanGame.第三排 = Randomizer.nextInt(4) + 6;
break;
}
case 8: {
BeanGame.第三排 = Randomizer.nextInt(8);
break;
}
case 9: {
BeanGame.第三排 = Randomizer.nextInt(7);
break;
}
}
BeanGame.第二排 = Randomizer.nextInt(10);
BeanGame.启动打怪效果 = 0;
BeanGame.中奖率 = 0;
BeanGame.加速旋转 = 0;
BeanGame.打中女皇出现特效A = false;
BeanGame.打中女皇出现特效B = false;
}
c.getSession().write(MaplePacketCreator.BeansJDXZ(get进洞次数(), BeanGame.第一排, BeanGame.第三排, BeanGame.第二排, BeanGame.启动打怪效果, BeanGame.中奖率, BeanGame.加速旋转, BeanGame.打中女皇出现特效A, BeanGame.打中女皇出现特效B));
c.sendPacket(MaplePacketCreator.enableActions());
if (BeanGame.第二排 == 9) {
break;
}
if (Randomizer.nextInt(Integer.parseInt(黄金狗机率[0])) == Integer.parseInt(黄金狗机率[1]) && BeanGame.黄金狗设置局数 == 0) {
BeanGame.黄金狗设置局数 = 1;
c.getSession().write(MaplePacketCreator.BeansHJG((byte) 1));
break;
}
BeanGame.黄金狗设置局数 = 0;
c.getSession().write(MaplePacketCreator.BeansHJG((byte) 0));
break;
}
case 5: {
if ((BeanGame.第一排 == 0 && BeanGame.第三排 == 0 && BeanGame.第二排 == 0) || (BeanGame.第一排 == 9 && BeanGame.第三排 == 7 && BeanGame.第二排 == 1) || (BeanGame.第一排 == 4 && BeanGame.第三排 == 9 && BeanGame.第二排 == 2) || (BeanGame.第一排 == 1 && BeanGame.第三排 == 2 && BeanGame.第二排 == 3) || (BeanGame.第一排 == 7 && BeanGame.第三排 == 5 && BeanGame.第二排 == 4) || (BeanGame.第一排 == 5 && BeanGame.第三排 == 1 && BeanGame.第二排 == 5) || (BeanGame.第一排 == 2 && BeanGame.第三排 == 4 && BeanGame.第二排 == 6) || (BeanGame.第一排 == 8 && BeanGame.第三排 == 8 && BeanGame.第二排 == 7) || (BeanGame.第一排 == 6 && BeanGame.第三排 == 3 && BeanGame.第二排 == 8) || (BeanGame.第一排 == 3 && BeanGame.第三排 == 6 && BeanGame.第二排 == 9)) {
final int itemId = 0;
final int experi = Randomizer.nextInt(Math.abs(GameConstants.getExpNeededForLevel((int) c.getPlayer().getLevel()) / 800) + 1);
final int beilu = (c.getPlayer().getLevel() <= 50) ? 1 : ((c.getPlayer().getLevel() > 50 && c.getPlayer().getLevel() <= 100) ? 2 : ((c.getPlayer().getLevel() > 100 && c.getPlayer().getLevel() <= 150) ? 4 : ((c.getPlayer().getLevel() > 150 && c.getPlayer().getLevel() <= 200) ? 8 : 1)));
final int experi2 = (int) Math.ceil((double) (experi / beilu));
final int x = Randomizer.nextInt(100) + 1;
final int count = 1;
switch (BeanGame.第二排) {
case 0:
case 5: {
if (Randomizer.nextInt(Integer.parseInt(白怪奖励[0])) > Randomizer.nextInt(Integer.parseInt(白怪奖励[1]))) {
c.getPlayer().gainExp(experi2, false, false, false);
c.getPlayer().dropMessage(5, "在小钢珠中获得:" + experi2 + "经验值!");
} else if (Randomizer.nextInt(Integer.parseInt(白怪奖励[2])) > Randomizer.nextInt(Integer.parseInt(白怪奖励[3]))) {
c.getPlayer().gainExp(experi2, false, false, false);
c.getPlayer().dropMessage(5, "在小钢珠中获得:" + experi2 + "经验值!");
}
c.sendPacket(MaplePacketCreator.enableActions());
break;
}
case 1:
case 3: {
if (Randomizer.nextInt(Integer.parseInt(色怪奖励[0])) > Randomizer.nextInt(Integer.parseInt(色怪奖励[1]))) {
c.getPlayer().gainExp(experi2, false, false, false);
c.getPlayer().dropMessage(5, "在小钢珠中获得:" + experi2 + "经验值!");
} else if (Randomizer.nextInt(Integer.parseInt(色怪奖励[4])) > Randomizer.nextInt(Integer.parseInt(色怪奖励[5]))) {
c.getPlayer().gainExp(experi2, false, false, false);
c.getPlayer().dropMessage(5, "在小钢珠中获得:" + experi2 + "经验值!");
} else if (Randomizer.nextInt(Integer.parseInt(色怪奖励[2])) > Randomizer.nextInt(Integer.parseInt(色怪奖励[3]))) {
c.getPlayer().gainExp(experi2, false, false, false);
c.getPlayer().dropMessage(5, "在小钢珠中获得:" + experi2 + "经验值!");
}
c.sendPacket(MaplePacketCreator.enableActions());
break;
}
case 2:
case 4:
case 6:
case 7:
case 8: {
if (Randomizer.nextInt(Integer.parseInt(五职业奖励[0])) > Randomizer.nextInt(Integer.parseInt(五职业奖励[1]))) {
c.getPlayer().gainExp(experi2, false, false, false);
c.getPlayer().dropMessage(5, "在小钢珠中获得:" + experi2 + "经验值!");
} else if (Randomizer.nextInt(Integer.parseInt(五职业奖励[4])) > Randomizer.nextInt(Integer.parseInt(五职业奖励[5]))) {
c.getPlayer().gainExp(experi2, false, false, false);
c.getPlayer().dropMessage(5, "在小钢珠中获得:" + experi2 + "经验值!");
} else if (Randomizer.nextInt(Integer.parseInt(五职业奖励[6])) > Randomizer.nextInt(Integer.parseInt(五职业奖励[7]))) {
c.getPlayer().gainExp(experi2, false, false, false);
c.getPlayer().dropMessage(5, "在小钢珠中获得:" + experi2 + "经验值!");
} else if (Randomizer.nextInt(Integer.parseInt(五职业奖励[2])) > Randomizer.nextInt(Integer.parseInt(五职业奖励[3]))) {
c.getPlayer().gainExp(experi2, false, false, false);
c.getPlayer().dropMessage(5, "在小钢珠中获得:" + experi2 + "经验值!");
}
c.sendPacket(MaplePacketCreator.enableActions());
break;
}
case 9: {
if (Randomizer.nextInt(Integer.parseInt(女皇奖励[4])) > Randomizer.nextInt(Integer.parseInt(女皇奖励[5]))) {
c.getPlayer().gainExp(experi2, false, false, false);
c.getPlayer().dropMessage(5, "在小钢珠中获得:" + experi2 + "经验值!");
} else if (x == 海洋帽子机率) {
c.getPlayer().gainExp(experi2, false, false, false);
c.getPlayer().dropMessage(5, "在小钢珠中获得:" + experi2 + "经验值!");
} else if (Randomizer.nextInt(Integer.parseInt(女皇奖励[6])) > Randomizer.nextInt(Integer.parseInt(女皇奖励[7]))) {
c.getPlayer().gainExp(experi2, false, false, false);
c.getPlayer().dropMessage(5, "在小钢珠中获得:" + experi2 + "经验值!");
} else if (Randomizer.nextInt(Integer.parseInt(女皇奖励[2])) > Randomizer.nextInt(Integer.parseInt(女皇奖励[3]))) {
c.getPlayer().gainExp(experi2, false, false, false);
c.getPlayer().dropMessage(5, "在小钢珠中获得:" + experi2 + "经验值!");
}
c.sendPacket(MaplePacketCreator.enableActions());
break;
}
default: {
System.out.println("未处理的类型A【" + type + "\n包" + slea.toString());
break;
}
}
final int 奖励豆豆 = 1 * 豆豆奖励范围;
chr.modifyJF(4, 奖励豆豆);
c.getPlayer().dropMessage(5, "在小钢珠中获得: " + 奖励豆豆 + "小钢珠积分!");
if (chr.getMapId() == 809030000) {
final String notea = "恭喜你小钢珠成功中奖!当前中获得:" + 奖励豆豆 + "小钢珠积分!";
c.getSession().write(MaplePacketCreator.BeansGameMessage(1, 1, notea));
}
if (BeanGame.黄金狗设置局数 > 0 && BeanGame.第二排 == 9) {
BeanGame.黄金狗设置局数 = 0;
c.getSession().write(MaplePacketCreator.BeansHJG((byte) 0));
}
break;
}
break;
}
case 7: {
if (BeanGame.黄金狗设置局数 > 0) {
BeanGame.黄金狗设置局数 = 0;
c.getSession().write(MaplePacketCreator.BeansHJG((byte) 0));
break;
}
break;
}
case 11: {
slea.readShort();
力度 = Randomizer.rand(1000, 5000);
豆豆序号 = slea.readInt() + 1;
chr.setBeansRange(力度);
chr.setBeansNum(豆豆序号);
if (豆豆序号 == 1) {
chr.setCanSetBeansNum(false);
break;
}
break;
}
case 6: {
slea.skip(1);
final int 循环次数 = slea.readByte();
if (循环次数 == 0) {
c.sendPacket(MaplePacketCreator.enableActions());
return;
}
if (循环次数 != 1) {
slea.skip((循环次数 - 1) * 8);
}
if (chr.isCanSetBeansNum()) {
chr.setBeansNum(chr.getBeansNum() + 循环次数);
}
chr.gainBeans(-循环次数);
chr.setCanSetBeansNum(true);
break;
}
default: {
System.out.println("未处理未知类型【" + type + "\n包" + slea.toString());
FileoutputUtil.logToFile("logs/小钢珠未知类型.txt", "时间: " + FileoutputUtil.NowTime() + " IP: " + chr.getClient().getSessionIPAddress() + " MAC: " + chr.getNowMacs() + chr.getName() + "类型【" + type + "\n包" + slea.toString() + "\r\n");
break;
}
}
if (type == 11 || type == 6) {
for (int i = 0; i < 5; ++i) {
beansInfo.add(new MapleBeans(rand(1000, 5000), getBeanType(), chr.getBeansNum() + i));
}
c.getSession().write(MaplePacketCreator.showBeans(beansInfo));
c.sendPacket(MaplePacketCreator.enableActions());
}
c.getSession().write(MaplePacketCreator.updateBeans(c.getPlayer()));
c.sendPacket(MaplePacketCreator.enableActions());
}
private static int getBeanType() {
final int random = rand(1, 100);
final int beanType = 0;
return beanType;
}
public static final int get进洞次数() {
return BeanGame.进洞次数;
}
public static final void gain进洞次数(final int a) {
BeanGame.进洞次数 += a;
}
public static final void set进洞次数(final int a) {
BeanGame.进洞次数 = a;
}
private static int rand(final int lbound, final int ubound) {
return (int) (Math.random() * (double) (ubound - lbound + 1) + (double) lbound);
}
public static final void updateBeans(final LittleEndianAccessor slea, final MapleClient c) {
c.getSession().write(MaplePacketCreator.updateBeans(c.getPlayer()));
c.getSession().write(MaplePacketCreator.enableActions());
}
static {
进洞次数 = 0;
第一排 = 0;
第三排 = 0;
第二排 = 0;
启动打怪效果 = 0;
中奖率 = 0;
加速旋转 = 0;
打中女皇出现特效A = false;
打中女皇出现特效B = false;
= 0;
绿 = 0;
= 0;
黄金狗设置局数 = 0;
}
public enum BeansType {
开始打豆豆(0),
颜色求进洞(3),
进洞旋转(4),
奖励豆豆效果(5),
未知效果(6),
黄金狗(7),
奖励豆豆效果B(8),
领奖NPC(9);
final byte type;
private BeansType(final int type) {
this.type = (byte) type;
}
public byte getType() {
return this.type;
}
}
}