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:
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user