Merge remote-tracking branch 'upstream/master' into master

Nice insider info btw, be nice if you shared it, so-called "open source" client.
This commit is contained in:
ThatGamerBlue
2021-05-28 21:39:25 +01:00
481 changed files with 53410 additions and 51723 deletions

View File

@@ -0,0 +1,61 @@
/*
* Copyright (c) 2021, ThatGamerBlue <thatgamerblue@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.mixins;
import net.runelite.api.clan.ClanRank;
import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Shadow;
import net.runelite.rs.api.RSClanChannelMember;
import net.runelite.rs.api.RSClient;
@Mixin(RSClanChannelMember.class)
public abstract class RSClanChannelMemberMixin implements RSClanChannelMember
{
@Shadow("client")
private static RSClient client;
@Inject
@Override
public int compareTo(Object other)
{
return getName().compareTo(((RSClanChannelMember) other).getName());
}
@Inject
@Override
public String getPrevName()
{
return null;
}
@Inject
@Override
public ClanRank getRank()
{
return client.getClanRankFromRs(getRSRank());
}
}

View File

@@ -0,0 +1,92 @@
/*
* Copyright (c) 2021, ThatGamerBlue <thatgamerblue@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.mixins;
import java.util.List;
import net.runelite.api.clan.ClanChannelMember;
import net.runelite.api.events.ClanMemberJoined;
import net.runelite.api.events.ClanMemberLeft;
import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.MethodHook;
import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Shadow;
import net.runelite.rs.api.RSClanChannel;
import net.runelite.rs.api.RSClanChannelMember;
import net.runelite.rs.api.RSClient;
@Mixin(RSClanChannel.class)
public abstract class RSClanChannelMixin implements RSClanChannel
{
@Shadow("client")
private static RSClient client;
@Inject
@Override
public ClanChannelMember findMember(String name)
{
name = name.replace(" ", "\u00A0");
List<ClanChannelMember> members = getMembers();
int[] sorted = getSortedMembers();
int i = 0;
int len = sorted.length - 1;
while (i <= len)
{
int tag = (i + len) >>> 1;
int memberIndex = sorted[tag];
RSClanChannelMember member = (RSClanChannelMember) members.get(memberIndex);
int compare = member.getName().compareTo(name);
if (compare < 0)
{
i = tag + 1;
}
else
{
if (compare <= 0)
{
return member;
}
len = tag - 1;
}
}
return null;
}
@Inject
@MethodHook("removeMember")
public void onMemberRemoved(int index)
{
client.getCallbacks().post(new ClanMemberLeft(this, getMembers().get(index)));
}
@Inject
@MethodHook(value = "addMember", end = true)
public void onMemberAdded(RSClanChannelMember member)
{
client.getCallbacks().post(new ClanMemberJoined(this, member));
}
}

View File

@@ -0,0 +1,208 @@
/*
* Copyright (c) 2021, ThatGamerBlue <thatgamerblue@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.mixins;
import java.util.ArrayList;
import java.util.List;
import net.runelite.api.EnumComposition;
import net.runelite.api.clan.ClanMember;
import net.runelite.api.clan.ClanRank;
import net.runelite.api.clan.ClanTitle;
import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Shadow;
import net.runelite.rs.api.RSClanSettings;
import net.runelite.rs.api.RSClient;
@Mixin(RSClanSettings.class)
public abstract class RSClanSettingsMixin implements RSClanSettings
{
@Shadow("client")
private static RSClient client;
@Inject
@Override
public List<ClanMember> getMembers()
{
int memberCount = getMemberCount();
String[] memberNames = getMemberNames();
byte[] memberRanks = getMemberRanks();
List<ClanMember> memberList = new ArrayList<>(memberCount);
for (int i = 0; i < memberCount; i++)
{
memberList.add(new ClanMember(memberNames[i], client.getClanRankFromRs(memberRanks[i])));
}
return memberList;
}
@Inject
@Override
public ClanMember findMember(String name)
{
name = name.replace(" ", "\u00A0").toLowerCase();
String[] memberNames = getMemberNames();
byte[] memberRanks = getMemberRanks();
int[] sorted = getSortedMembers();
int i = 0;
int len = sorted.length - 1;
while (i <= len)
{
int tag = (i + len) >>> 1;
int memberIndex = sorted[tag];
String memberName = memberNames[memberIndex];
int compare = memberName.toLowerCase().compareTo(name);
if (compare < 0)
{
i = tag + 1;
}
else if (compare == 0)
{
return new ClanMember(memberName, client.getClanRankFromRs(memberRanks[tag]));
}
else
{
len = tag - 1;
}
}
return null;
}
@Inject
@Override
public ClanTitle titleForRank(ClanRank clanRank)
{
assert client.isClientThread() : "titleForRank must be called on client thread";
int title;
if (clanRank == ClanRank.JMOD)
{
title = -5;
}
else if (clanRank == ClanRank.OWNER)
{
title = -4;
}
else if (clanRank == ClanRank.DEPUTY_OWNER)
{
title = -3;
}
else if (clanRank == ClanRank.ADMINISTRATOR)
{
title = -2;
}
else if (clanRank == ClanRank.GUEST)
{
title = -1;
}
else if (clanRank == ClanRank.CLAN_RANK_1)
{
title = getTitle(1, 0, 9);
}
else if (clanRank == ClanRank.CLAN_RANK_2)
{
title = getTitle(1, 10, 19);
}
else if (clanRank == ClanRank.CLAN_RANK_3)
{
title = getTitle(1, 20, 29);
}
else if (clanRank == ClanRank.CLAN_RANK_4)
{
title = getTitle(2, 0, 9);
}
else if (clanRank == ClanRank.CLAN_RANK_5)
{
title = getTitle(2, 10, 19);
}
else if (clanRank == ClanRank.CLAN_RANK_6)
{
title = getTitle(2, 20, 29);
}
else if (clanRank == ClanRank.CLAN_RANK_7)
{
title = getTitle(3, 0, 9);
}
else if (clanRank == ClanRank.CLAN_RANK_8)
{
title = getTitle(3, 10, 19);
}
else if (clanRank == ClanRank.CLAN_RANK_9)
{
title = getTitle(3, 20, 29);
}
else if (clanRank == ClanRank.CLAN_RANK_10)
{
title = getTitle(4, 0, 9);
}
else if (clanRank == ClanRank.CLAN_RANK_11)
{
title = getTitle(4, 10, 19);
}
else if (clanRank == ClanRank.CLAN_RANK_12)
{
title = getTitle(4, 20, 29);
}
else if (clanRank == ClanRank.CLAN_RANK_13)
{
title = getTitle(5, 0, 9);
}
else if (clanRank == ClanRank.CLAN_RANK_14)
{
title = getTitle(5, 10, 19);
}
else
{
throw new IllegalStateException("Unexpected value: " + clanRank);
}
if (title == 1023)
{
return null;
}
EnumComposition rsEnum = client.getEnum(3797);
String titleName = rsEnum.getStringValue(title);
if (titleName.isEmpty())
{
return null;
}
return new ClanTitle(title, titleName);
}
@Inject
private int getTitle(int group, int sub1, int sub2)
{
Integer oParam = getTitleGroupValue(group);
int param = oParam == null ? -1 : oParam;
int offset = 31 - sub2;
return (param << offset) >>> (sub1 + offset);
}
}

View File

@@ -75,6 +75,9 @@ import net.runelite.api.VarPlayer;
import net.runelite.api.Varbits;
import net.runelite.api.WidgetNode;
import net.runelite.api.WorldType;
import net.runelite.api.clan.ClanChannel;
import net.runelite.api.clan.ClanRank;
import net.runelite.api.clan.ClanSettings;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.events.CanvasSizeChanged;
@@ -1242,7 +1245,7 @@ public abstract class RSClientMixin implements RSClient
}
}
@FieldHook("clanChat")
@FieldHook("friendsChat")
@Inject
public static void clanMemberManagerChanged(int idx)
{
@@ -2200,5 +2203,66 @@ public abstract class RSClientMixin implements RSClient
{
client.getCallbacks().post(new WidgetClosed(iface.getId(), iface.getModalMode(), willUnload));
}
@Inject
@Override
public ClanChannel getClanChannel()
{
return getCurrentClanChannels()[0];
}
@Inject
@Override
public ClanSettings getClanSettings()
{
return getCurrentClanSettingsAry()[0];
}
@Inject
@Override
public ClanRank getClanRankFromRs(int rank)
{
switch (rank)
{
case -1:
return ClanRank.GUEST;
case 10:
return ClanRank.CLAN_RANK_2;
case 20:
return ClanRank.CLAN_RANK_3;
case 30:
return ClanRank.CLAN_RANK_4;
case 40:
return ClanRank.CLAN_RANK_5;
case 50:
return ClanRank.CLAN_RANK_6;
case 60:
return ClanRank.CLAN_RANK_7;
case 70:
return ClanRank.CLAN_RANK_8;
case 80:
return ClanRank.CLAN_RANK_9;
case 90:
return ClanRank.CLAN_RANK_10;
case 100:
return ClanRank.ADMINISTRATOR;
case 105:
return ClanRank.CLAN_RANK_11;
case 110:
return ClanRank.CLAN_RANK_12;
case 115:
return ClanRank.CLAN_RANK_13;
case 120:
return ClanRank.CLAN_RANK_14;
case 125:
return ClanRank.DEPUTY_OWNER;
case 126:
return ClanRank.OWNER;
case 127:
return ClanRank.JMOD;
default:
return ClanRank.CLAN_RANK_1;
}
}
}

View File

@@ -6,13 +6,13 @@ import net.runelite.api.events.FriendsChatMemberLeft;
import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Shadow;
import net.runelite.rs.api.RSClanChat;
import net.runelite.rs.api.RSFriendsChat;
import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSUser;
import net.runelite.rs.api.RSUsername;
@Mixin(RSClanChat.class)
public abstract class RSClanChatMixin implements RSClanChat
@Mixin(RSFriendsChat.class)
public abstract class RSFriendsChatMixin implements RSFriendsChat
{
@Shadow("client")
private static RSClient client;

View File

@@ -5,7 +5,7 @@ import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.MethodHook;
import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Shadow;
import net.runelite.rs.api.RSClanChat;
import net.runelite.rs.api.RSFriendsChat;
import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSMessage;
@@ -76,7 +76,7 @@ public abstract class RSMessageMixin implements RSMessage
@Override
public boolean isFromClanMate()
{
RSClanChat cc = client.getFriendsChatManager();
RSFriendsChat cc = client.getFriendsChatManager();
return cc != null && cc.findByName(this.getSenderUsername()) != null;
}