boosters new

This commit is contained in:
Michael Wain 2024-06-16 03:41:13 +03:00
parent d7f51cba32
commit 6e685f9a79
8 changed files with 160 additions and 1 deletions

View File

@ -3,9 +3,12 @@ package com.alterdekim.hearthhack.component;
import com.alterdekim.hearthhack.config.ObjectConfig;
import com.alterdekim.hearthhack.config.FS;
import com.alterdekim.hearthhack.config.ServerConfig;
import com.alterdekim.hearthhack.game.GameTag;
import com.alterdekim.hearthhack.parser.CardsXmlParser;
import com.alterdekim.hearthhack.parser.DBFParser;
import com.alterdekim.hearthhack.xml.CardsXML;
import com.alterdekim.hearthhack.xml.XMLEntity;
import com.alterdekim.hearthhack.xml.XMLTag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.jdbc.DataSourceBuilder;

View File

@ -2,10 +2,17 @@ package com.alterdekim.hearthhack.component.processor.client.request;
import com.alterdekim.Protocol;
import com.alterdekim.hearthhack.component.TcpConnection;
import com.alterdekim.hearthhack.dbf.DBFCard;
import com.alterdekim.hearthhack.game.GameTag;
import com.alterdekim.hearthhack.util.BattleNetPacket;
import com.alterdekim.hearthhack.util.ClientRequestBody;
import com.alterdekim.hearthhack.util.Util;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import static com.alterdekim.hearthhack.util.GameUtilities.generateNotification;
@Slf4j
@ -23,7 +30,29 @@ public class OpenBooster extends ClientRequestParser {
.setSec(0)
.build();
// TODO: optimize this
List<Protocol.BoosterCard> l = Util.getRandomItems(conn.getDbfConfig().getCardsXML().findEntitiesByTagVal(GameTag.CARD_SET, 3).stream().filter(p -> {
Optional<DBFCard> c = conn.getDbfConfig().getCards().findWithMiniGuid(p.getCardId());
return c.isPresent() && c.get().findField("IS_COLLECTIBLE").isPresent() && c.get().findField("IS_COLLECTIBLE").get().getVal().equals("True");
}).collect(Collectors.toList()), 5)
.stream()
.map(e -> conn.getDbfConfig().getCards().findWithMiniGuid(e.getCardId()))
.filter(Optional::isPresent)
.map(Optional::get)
.map(c -> Protocol.BoosterCard.newBuilder()
.setCardDef(Protocol.CardDef.newBuilder()
.setAsset(Integer.parseInt(
c.getFields().stream().filter(p -> p.getColumn().equals("ID")).findFirst().get().getVal()
)
)
.setPremium(1))
.setInsertDate(d).build())
.collect(Collectors.toList());
Protocol.BoosterContent response = Protocol.BoosterContent.newBuilder()
.addAllList(l)
.build();
/* Protocol.BoosterContent response = Protocol.BoosterContent.newBuilder()
.addList(Protocol.BoosterCard.newBuilder()
.setCardDef(Protocol.CardDef.newBuilder()
.setAsset(459)
@ -49,7 +78,7 @@ public class OpenBooster extends ClientRequestParser {
.setAsset(459)
.setPremium(0))
.setInsertDate(d))
.build();
.build();*/
Protocol.Notification n = generateNotification(226, response.toByteString(), response.getSerializedSize());

View File

@ -6,6 +6,7 @@ import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import lombok.*;
import java.util.List;
import java.util.Optional;
@ToString
@Getter
@ -26,4 +27,12 @@ public class CardsDBF {
@JsonProperty("Record")
@JacksonXmlElementWrapper(useWrapping = false)
private List<DBFCard> records;
public Optional<DBFCard> findWithMiniGuid(String miniGuid) {
return records.stream()
.filter(r -> r.getFields().stream().anyMatch(c -> c.getColumn().equals("NOTE_MINI_GUID")))
.filter(r -> r.getFields().stream().filter(c -> c.getColumn().equals("NOTE_MINI_GUID")).findFirst().get().getVal().equals(miniGuid))
.findFirst();
}
}

View File

@ -5,6 +5,7 @@ import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import lombok.*;
import java.util.List;
import java.util.Optional;
@Getter
@Setter
@ -16,4 +17,8 @@ public class DBFCard {
@JsonProperty("Field")
@JacksonXmlElementWrapper(useWrapping = false)
private List<DBFField> fields;
public Optional<DBFField> findField(String field) {
return fields.stream().filter(f -> f.getColumn().equals(field)).findFirst();
}
}

View File

@ -1,5 +1,7 @@
package com.alterdekim.hearthhack.game;
import lombok.Getter;
public enum GameTag {
// Token: 0x04000B83 RID: 2947
TAG_SCRIPT_DATA_ENT_1(4),
@ -480,10 +482,18 @@ public enum GameTag {
// Token: 0x04000C71 RID: 3185
SEEN_CTHUN(445);
@Getter
private final Integer value;
GameTag(Integer value) {
this.value = value;
}
public static GameTag fromInt(int val) {
for( GameTag t : values() ) {
if(t.value.intValue() == val) return t;
}
return null;
}
}

View File

@ -0,0 +1,51 @@
package com.alterdekim.hearthhack.game;
public enum TagCardSet {
// Token: 0x04000B64 RID: 2916
INVALID,
// Token: 0x04000B65 RID: 2917
TEST_TEMPORARY,
// Token: 0x04000B66 RID: 2918
CORE,
// Token: 0x04000B67 RID: 2919
EXPERT1,
// Token: 0x04000B68 RID: 2920
REWARD,
// Token: 0x04000B69 RID: 2921
MISSIONS,
// Token: 0x04000B6A RID: 2922
DEMO,
// Token: 0x04000B6B RID: 2923
NONE,
// Token: 0x04000B6C RID: 2924
CHEAT,
// Token: 0x04000B6D RID: 2925
BLANK,
// Token: 0x04000B6E RID: 2926
DEBUG_SP,
// Token: 0x04000B6F RID: 2927
PROMO,
// Token: 0x04000B70 RID: 2928
FP1,
// Token: 0x04000B71 RID: 2929
PE1,
// Token: 0x04000B72 RID: 2930
BRM,
// Token: 0x04000B73 RID: 2931
TGT,
// Token: 0x04000B74 RID: 2932
CREDITS,
// Token: 0x04000B75 RID: 2933
HERO_SKINS,
// Token: 0x04000B76 RID: 2934
TB,
// Token: 0x04000B77 RID: 2935
SLUSH,
// Token: 0x04000B78 RID: 2936
LOE,
// Token: 0x04000B79 RID: 2937
OG,
// Token: 0x04000B7A RID: 2938
OG_RESERVE
}

View File

@ -18,6 +18,13 @@ import java.security.KeyStore;
import java.security.Security;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
@Slf4j
public class Util {
@ -137,4 +144,23 @@ public class Util {
String s = Integer.toHexString(i).toUpperCase();
return s.length() % 2 == 0 ? s : "0" + s;
}
public static <T> Collector<T, List<T>, T> randomItem() {
final Random RANDOM = new Random();
return Collector.of(() -> (List<T>) new ArrayList<T>(),
(acc, elem) -> acc.add(elem),
(list1, list2) -> Util.unionLists(list1, list2),
list -> list.isEmpty() ? null : list.get(RANDOM.nextInt(list.size())));
}
public static <T> List<T> getRandomItems(List<T> s, Integer lim) {
return IntStream.range(0, lim)
.boxed()
.map(i -> s.get((int) (Math.random() * s.size())))
.collect(Collectors.toList());
}
public static <T> List<T> unionLists(List<T> a, List<T> b) {
return Stream.concat(a.stream(), b.stream()).collect(Collectors.toList());
}
}

View File

@ -1,10 +1,13 @@
package com.alterdekim.hearthhack.xml;
import com.alterdekim.hearthhack.game.GameTag;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import lombok.*;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@ToString
@Getter
@ -15,4 +18,27 @@ public class CardsXML {
@JsonProperty("Entity")
@JacksonXmlElementWrapper(useWrapping = false)
private List<XMLEntity> entities;
public Optional<XMLEntity> findEntityByCardId(String cardId) {
return this.entities.stream().filter(p -> p.getCardId().equals(cardId)).findFirst();
}
public List<XMLEntity> findEntitiesByTagVal(GameTag tag, Integer val) {
return this.entities.stream()
.filter(p -> p.getTags()
.stream()
.anyMatch(f -> f.getEnumID().intValue() == tag.getValue().intValue() && f.getValue().intValue() == val.intValue())
)
.collect(Collectors.toList());
}
public List<XMLEntity> findEntitiesByTagVal(GameTag tag, String val) {
return this.entities.stream()
.filter(p -> p.getTags()
.stream()
.anyMatch(f -> f.getEnumID().intValue() == tag.getValue().intValue() && f.getVal().equals(val))
)
.collect(Collectors.toList());
}
}