Natsukage/PostNamazu

关于mark在实际应用中产生的一个功能需求。

Closed this issue · 7 comments

应用场景

在本次高难副本(例P4S,P7S)中,我身处一个连续指定多个玩家进行标记的场景下,即在一分钟之内每相隔十几秒左右,则需要对(随机)多名玩家进行目标标记。
多亏了邮差的ActorID指定功能,我们不再需要去笨拙的获取小队列表的序列来发送doTextCommand指令。
但他也令我遇到了一个新的问题:我需要在新的一轮标记开始前先清空所有人(或许是数个制定的人们),再才可以继续执行新的一轮工作。否则在目标已有标记的清空下,如果后来执行的marktype与目标已有的目标标记相同的话,则会取消该玩家的目标标记。
在先前P4S中,由于节奏较慢,我可以通过每次Boss执行AoE技能时通过doTextCommand执行发送/mark off <1~8>来回避此问题。
但在本次P7S中,在快节奏的机制轰炸下,我明显感到狼狈不堪,无法得到稳定的取消标记的时机。

功能需求

为了解决上述问题,我认为需要一个新的功能:在调用mark命令时通过给markType传入类似clear的指令可以去掉该Actor的目标标记。

Hi, I see this was "Closed as completed", but I can't seem to find how to do this. How would I clear a marker on a specific entity?

(Google Translate, sorry)

嗨,我看到这是“已完成关闭”,但我似乎无法找到如何执行此操作。 我将如何清除特定实体上的标记?

(谷歌翻译,抱歉)

Hi, I see this was "Closed as completed", but I can't seem to find how to do this. How would I clear a marker on a specific entity?

(Google Translate, sorry)

嗨,我看到这是“已完成关闭”,但我似乎无法找到如何执行此操作。 我将如何清除特定实体上的标记?

(谷歌翻译,抱歉)

嗨,在这个问题上,我认为没有一个完美的解决方案。

首先要知道的是,当我们在FFXIV层面清除了一个2号队员的“attack1”标记时(例如使用/mk off <2>),实际上系统是在向0xe000000这个不可见目标标记了"attack1"。所以实际上我们并没有取消某标记的方式。

所以我认为如果我们要达到这个效果,可以通过监听onLogEvent事件的Line 29 (0x1D): NetworkTargetMarker (Player Marker),来人为的记录一份现有的标记情况。这样,当我们想要取消某个标记时,便可以找到某个ActorID的MarkType,去给0xe000000来取消。这并不适用于localOnly的标记,因为他并不会产生LogLine,所以该方法局限性较大。

或者,重新审视您想要实现的效果,以其他方式来实现它。例如,我现在使用queue指令来实现稳定可控的间隔。

Hi, I don't think there is a perfect solution to this problem.

The first thing to know is that when we clear the attack1 flag of a team member#2 at the FFXIV level (e.g. using /mk off <2>), the system is actually marking attack1 to the invisible target 0xe000000. So we don't actually have a way to unmark something.

So I think if we want to achieve this effect, we can artificially record a copy of the existing markers by listening to the onLogEvent event Line 29 (0x1D): NetworkTargetMarker (Player Marker). This way, when we want to cancel a marker, we can find the MarkType of an ActorID and give it to 0xe000000 to cancel it. This doesn't work with localOnly markers, because they don't generate a LogLine, so this method is more limited.

Or, revisit the effect you want to achieve and implement it in another way. For example, I now use the queue command to achieve a stable and controlled interval.

Translated with www.DeepL.com/Translator (free version)

谢谢。 我正在考虑做类似的事情,但我遇到的问题是 mark 命令允许您按 ID 标记,但是 /mk off <?> 需要一个派对位置。 这意味着我不得不担心 ACT 派对列表错误,而且它不适用于敌人等非派对实体。

我将改为尝试“0xE000000”方法。 是否确认这对服务器来说看起来就像一个“/mk off”? 如果 SE 可以检测到它,我不希望有人因为它而被禁止。

我试图做的是在我的程序中支持另一种标记方法,Triggevent,我比其他方法更喜欢这种方法,因为我可以完全跳过派对列表,所以它更可靠并且可以在派对之外进行标记。

Thank you. I was considering doing something like that, but the problem I ran into is that the mark command lets you mark by ID, but /mk off <?> requires a party slot. This means I have to worry about ACT party list bugs, and also it won't work for non-party entities such as enemies.

I will try the 0xE000000 method instead. Is it confirmed that this will look exactly like a /mk off to the server? I don't want someone to get banned over it if SE can detect it.

What I'm attempting to do is support another marking method in my program, Triggevent, and I like this more than the other methods because I can skip the party list entirely, so it is more reliable and can mark outside the party.

谢谢。 我正在考虑做类似的事情,但我遇到的问题是 mark 命令允许您按 ID 标记,但是 /mk off <?> 需要一个派对位置。 这意味着我不得不担心 ACT 派对列表错误,而且它不适用于敌人等非派对实体。

我将改为尝试“0xE000000”方法。 是否确认这对服务器来说看起来就像一个“/mk off”? 如果 SE 可以检测到它,我不希望有人因为它而被禁止。

我试图做的是在我的程序中支持另一种标记方法,Triggevent,我比其他方法更喜欢这种方法,因为我可以完全跳过派对列表,所以它更可靠并且可以在派对之外进行标记。

Thank you. I was considering doing something like that, but the problem I ran into is that the mark command lets you mark by ID, but /mk off <?> requires a party slot. This means I have to worry about ACT party list bugs, and also it won't work for non-party entities such as enemies.

I will try the 0xE000000 method instead. Is it confirmed that this will look exactly like a /mk off to the server? I don't want someone to get banned over it if SE can detect it.

What I'm attempting to do is support another marking method in my program, Triggevent, and I like this more than the other methods because I can skip the party list entirely, so it is more reliable and can mark outside the party.

/mk off <2>这条命令实际在游戏客户端中做的事情是,首先它在本地游戏客户端中查找第二名队员,取得他当前持有的标记,例如 attack1,然后客户端向服务器发送了一个“给0xE000000标记attack1”的指令。这点可以通过抓取数据包看出来。
客户端在发送这条指令给服务器之前,首先在本地执行了额外的操作,根据你指定的队员获取到了其当前持有的标记种类,然后将获取到的标记种类发给了服务器,而不是直接将/mk off <2>这段文本发给了服务器让服务器进行处理。
所以,没错,对服务端来说两者是等同的。

The /mk off <2> command actually does the following in the game client: First, it searches for the second party member in the local game client and obtains their current marker, such as attack1. Then, the client sends a command to the server to "assign the attack1 marker to 0xE000000" This can be seen by capturing data packets.
Before the client sends this command to the server, it first performs additional operations locally, obtaining the type of marker currently held by the specified party member. Then it sends the obtained marker type to the server, rather than directly sending the text "/mk off <2>" to the server for processing.

So, yes, /mk off <2> amd assign the attack1 marker to 0xE000000 are equivalent to the server.

PostNamazu只拥有向游戏发送数据的能力,并不像FFXIV.ACT.Plugin一样拥有解析数据的功能,也无法得知当前每一名玩家持有的标记种类,所以要想取消第二名玩家头上的标记,要么需要自己维护一个玩家->标记的列表并直接将指定的标记赋给0xE000000,要么通过/mk off <2>,让游戏客户端来做这件事,并向服务端要求,将对应的标记赋给0xE000000。无论如何,对服务端来说,它收到的指令都是相同的"将attack 1标记赋给0xE000000"。

PostNamazu only has the ability to send data to the game and does not have the data parsing capabilities like FFXIV.ACT.Plugin. It cannot get the type of marker each player currently holds. So, if you want to remove the marker on the second player's head, either maintain a player-to-marker list yourself and directly assign the specified marker to 0xE000000, or use /mk off <2> to let the game client do this task and request the server to assign the corresponding marker to 0xE000000. In any case, for the server, the command it receives is the same: "Assign the attack 1 marker to 0xE000000."

谢谢,我成功了!

我想知道,为什么清除标记是E 00 00 00,但是数据包显示E0 00 00 00?

Thank you, I got it working!

I wonder, why is it E 00 00 00 to clear the marker, but the packet shows E0 00 00 00?

谢谢,我成功了!

我想知道,为什么清除标记是E 00 00 00,但是数据包显示E0 00 00 00?

Thank you, I got it working!

I wonder, why is it E 00 00 00 to clear the marker, but the packet shows E0 00 00 00?

抱歉,因为是很久以前研究的,我现在也不记得了。我当时好像根本就没注意到发送的数据内容究竟是E000000还是E0000000,下意识就以为是同一个数字了。也可能是后来SE修改过这部分,我不太确定。

I'm sorry, as the code for this part was written a long time ago, I can't remember it now. At that time, it seems that I didn't even pay attention to whether the data content sent was E000000 or E0000000, and subconsciously thought they were the same number. It is also possible that SE changed this part later, but I'm not quite sure.