Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Quest proxy #293

Merged
merged 31 commits into from
Jan 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
ae31b9e
Quest proxy
dm94 Jul 27, 2023
0da8598
fixed typo error
dm94 Jul 27, 2023
992d78c
Updated quest proxy
dm94 Jul 27, 2023
febc967
fix typo error
dm94 Jul 27, 2023
c5eda90
Added conditionsCount
dm94 Jul 27, 2023
3465050
Revert facade manager format
dm94 Jul 27, 2023
f0f61d8
Updated method names
dm94 Jul 30, 2023
c7708fe
Merge branch 'master' into quest-proxy
dm94 Aug 4, 2023
02a4d62
New test offsets
dm94 Aug 21, 2023
da2b884
More data
dm94 Aug 26, 2023
a5a16e3
Merge pull request #2 from dm94/test-quest-proxy
dm94 Aug 26, 2023
02019db
Merge remote-tracking branch 'oficial/master' into quest-proxy
dm94 Oct 8, 2023
b91744f
QuestProxy updated
dm94 Oct 23, 2023
ed190a5
Fix typo error
dm94 Oct 24, 2023
7956a62
Fixed questGiverSelected and added isVisibleQuestGiver method
dm94 Oct 25, 2023
bcab6ac
Implement getTabSelected and getCurrentQuestInfoSeleted
dm94 Oct 25, 2023
9a58833
Added isEnabled method
dm94 Oct 25, 2023
6f1762e
Renamed Condition by Requirement
dm94 Oct 26, 2023
a2a0ebf
Updated QuestProxy method names
dm94 Nov 3, 2023
80c1f22
Merge remote-tracking branch 'darkbot-origin/master' into quest-proxy
dm94 Nov 4, 2023
ef22a07
Updated quest object
dm94 Nov 4, 2023
b6b92c8
Merge branch 'master' into quest-proxy
dm94 Nov 25, 2023
0690959
reversed automatic formatting of facademanager
dm94 Nov 26, 2023
63e09fe
Updated to link the API
dm94 Nov 26, 2023
682893b
Updated to resolve comments
dm94 Nov 26, 2023
e0b4d7b
Now it does not update certain values until the quest giver is open
dm94 Nov 26, 2023
847f715
Changes regarding comments and some improvements
dm94 Nov 26, 2023
983e00d
feat: Recommended changes in the PR have been made
dm94 Dec 13, 2023
d78cf74
Sonar change
dm94 Dec 23, 2023
017b6e5
Update api version
Pablete1234 Jan 4, 2024
4e7f679
Merge branch 'master' into quest-proxy
Pablete1234 Jan 4, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ publishing {
}

dependencies {
val apiVersion = "0.8.4"
val apiVersion = "0.8.5"
val flatLafVersion = "3.1.1"

// use this if you want to use local(mavenLocal) darkbot API
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import com.github.manolo8.darkbot.core.objects.facades.SpaceMapWindowProxy;
import com.github.manolo8.darkbot.core.objects.facades.StatsProxy;
import com.github.manolo8.darkbot.core.objects.facades.WorldBossOverviewProxy;
import com.github.manolo8.darkbot.core.objects.facades.QuestProxy;
import com.github.manolo8.darkbot.core.objects.swf.PairArray;
import eu.darkbot.api.PluginAPI;

Expand Down Expand Up @@ -58,6 +59,7 @@ public class FacadeManager implements Manager, eu.darkbot.api.API.Singleton {
public final NpcEventProxy npcEventProxy;
public final WorldBossOverviewProxy worldBossOverview;
public final Updatable group;
public final QuestProxy quests;
public final Updatable groupMediator;

public FacadeManager(PluginAPI pluginApi) {
Expand All @@ -82,6 +84,7 @@ public FacadeManager(PluginAPI pluginApi) {
this.worldBossOverview = registerProxy("worldBoss_overview", WorldBossOverviewProxy.class);
this.group = registerProxy("GroupProxy", Updatable.NoOp.class);
this.groupMediator = registerMediator("GroupSystemMediator", Updatable.NoOp.class);
this.quests = registerProxy("QuestProxy", QuestProxy.class);

registerProxy("dispatch", DispatchProxy.class);
registerProxy("ggBuilder", GalaxyBuilderProxy.class);
Expand Down Expand Up @@ -125,6 +128,7 @@ public void tick() {
// Currently commands are not used by the bot and they represent
// a decently big cpu chunk in ticking. Leaving them out reduces tick time significantly.
//commands.update();

proxies.update();
mediators.update();

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,320 @@
package com.github.manolo8.darkbot.core.objects.facades;

import com.github.manolo8.darkbot.core.itf.Updatable;
import com.github.manolo8.darkbot.core.objects.swf.FlashList;
import com.github.manolo8.darkbot.core.objects.swf.ObjArray;

import eu.darkbot.api.managers.QuestAPI;

import static com.github.manolo8.darkbot.Main.API;

import java.util.ArrayList;
import java.util.List;

import org.jetbrains.annotations.Nullable;

public class QuestProxy extends Updatable implements QuestAPI {
private @Nullable QuestProxy.Quest currentQuest = new Quest();

private final List<QuestProxy.QuestListItem> questItems = new ArrayList<>();
private boolean questsUpdated = false;

private final ObjArray questItemsArr = ObjArray.ofArrObj(true);

private @Nullable QuestProxy.Quest questGiverSelected = new Quest();
private @Nullable QuestProxy.QuestListItem questInfoGiverSelected = new QuestListItem();

private boolean visibleQuestGiver;
private int tabSelected;

@Override
public void update() {
if (address == 0) {
return;
}

this.questsUpdated = false;

long questClass = API.readMemoryPtr(address + 0x98);

long currentQuestAddr = API.readMemoryPtr(questClass + 0x28);
this.currentQuest.update(currentQuestAddr);

this.visibleQuestGiver = API.readMemoryBoolean(address, 0x40);

if (!visibleQuestGiver) {
return;
}

this.tabSelected = API.readMemoryInt(address, 0x50);

long questInfoGiverSelectedAddr = API.readMemoryPtr(address + 0xA8);
this.questInfoGiverSelected.update(questInfoGiverSelectedAddr);

long questGiverSelectedAddr = API.readMemoryPtr(address + 0xB0);
this.questGiverSelected.update(questGiverSelectedAddr);
}

@Override
public @Nullable QuestAPI.Quest getDisplayedQuest() {
return currentQuest.address == 0 ? null : currentQuest;
}

@Override
public @Nullable QuestAPI.Quest getSelectedQuest() {
return !this.visibleQuestGiver || questGiverSelected.address == 0 ? null
: questGiverSelected;
}

@Override
public @Nullable QuestAPI.QuestListItem getSelectedQuestInfo() {
return !this.visibleQuestGiver || questInfoGiverSelected.address == 0 ? null
: questInfoGiverSelected;
}

@Override
public @Nullable List<? extends QuestAPI.QuestListItem> getCurrestQuests() {
if (!questsUpdated) {
questsUpdated = true;
questItemsArr.update(API.readMemoryPtr(address + 0x58));
questItemsArr.sync(questItems, QuestListItem::new);
}

return questItems;
}

@Override
public boolean isQuestGiverOpen() {
return visibleQuestGiver;
}

@Override
public int getSelectedTab() {
return tabSelected;
}

public static class QuestListItem extends Auto implements QuestAPI.QuestListItem {
private int id;
private boolean selected;
private boolean completed;
private String title;
private String type;
private int levelRequired;
private boolean activable;

@Override
public void update() {
if (address == 0) {
return;
}

this.id = API.readMemoryInt(address + 0x24);
this.levelRequired = API.readMemoryInt(address + 0x28);
this.selected = API.readMemoryBoolean(address + 0x34);
this.completed = API.readMemoryBoolean(address + 0x38);
this.activable = API.readMemoryBoolean(address + 0x3C);
this.title = API.readMemoryString(address, 0x58);
this.type = API.readMemoryString(address, 0x70);
}

@Override
public int getId() {
return id;
}

@Override
public int getLevelRequired() {
return levelRequired;
}

@Override
public boolean isSelected() {
return selected;
}

@Override
public boolean isCompleted() {
return completed;
}

@Override
public String getTitle() {
return title;
}

@Override
public String getType() {
return type;
}

@Override
public boolean isActivable() {
return activable;
}
}

public static class Quest extends Auto implements QuestAPI.Quest {
private boolean active;
private String description;
private String title;
private int id;
private boolean completed;

private final FlashList<QuestProxy.Requirement> requirementItems = FlashList.ofArray(Requirement.class);

private final List<QuestProxy.Reward> rewardItems = new ArrayList<>();
private final ObjArray rewardItemsArr = ObjArray.ofArrObj(true);

@Override
public void update() {
if (address == 0) {
return;
}

this.id = API.readMemoryInt(address + 0x20);
this.active = API.readMemoryBoolean(address + 0x24);
this.title = API.readMemoryString(address, 0x68);
this.description = API.readMemoryString(address, 0x70);

long requirementAddr = API.readMemoryPtr(address + 0x38);
this.completed = API.readMemoryBoolean(requirementAddr, 0x38);

requirementItems.update(API.readMemoryPtr(address + 0x40));
requirementItems.update();

if (!this.rewardItems.isEmpty()) {
return;
}

rewardItemsArr.update(API.readMemoryPtr(address + 0x50));
rewardItemsArr.sync(rewardItems, Reward::new);
}

@Override
public int getId() {
return id;
}

@Override
public boolean isActive() {
return active;
}

@Override
public String getTitle() {
return title;
}

@Override
public String getDescription() {
return description;
}

@Override
public boolean isCompleted() {
return completed;
}

@Override
public List<? extends QuestAPI.Requirement> getRequirements() {
return requirementItems;
}

@Override
public List<? extends QuestAPI.Reward> getRewards() {
return rewardItems;
}
}

public static class Reward extends Auto implements QuestAPI.Reward {
private int amount;
private String type;

@Override
public void update() {
if (address == 0) {
return;
}

this.amount = API.readMemoryInt(address + 0x20);
this.type = API.readMemoryString(address, 0x28);
}

@Override
public int getAmount() {
return amount;
}

@Override
public String getType() {
return type;
}
}

public static class Requirement extends Auto implements QuestAPI.Requirement {
private String description;
private double goalReached;
private double goal;
private boolean completed;
private boolean enabled;

private final List<QuestProxy.Requirement> requirementItems = new ArrayList<>();
private final ObjArray requirementItemsArr = ObjArray.ofArrObj(true);

private String requirementType;

@Override
public void update() {
if (address == 0) {
return;
}

this.enabled = API.readMemoryBoolean(address + 0x24);
this.completed = API.readMemoryBoolean(address, 0x34);
this.description = API.readMemoryString(address, 0x60);
this.goalReached = API.readMemoryDouble(address + 0x78);
this.goal = API.readMemoryDouble(address + 0x80);

long definitionAddr = API.readMemoryPtr(address + 0x58);
this.requirementType = API.readMemoryString(definitionAddr, 0x28);

requirementItemsArr.update(API.readMemoryPtr(address + 0x48));
requirementItemsArr.sync(requirementItems, Requirement::new);
}

@Override
public String getDescription() {
return description;
}

@Override
public double getProgress() {
return goalReached;
}

@Override
public double getGoal() {
return goal;
}

@Override
public boolean isCompleted() {
return completed;
}

@Override
public String getType() {
return requirementType;
}

@Override
public List<? extends QuestAPI.Requirement> getRequirements() {
return requirementItems;
}

@Override
public boolean isEnabled() {
return enabled;
}
}
}