Implemented Comparison Nodes and Low Health Alerts
This commit is contained in:
Binary file not shown.
BIN
Nodes/__pycache__/comparison_node.cpython-312.pyc
Normal file
BIN
Nodes/__pycache__/comparison_node.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
Nodes/__pycache__/flyff_low_health_alert_node.cpython-312.pyc
Normal file
BIN
Nodes/__pycache__/flyff_low_health_alert_node.cpython-312.pyc
Normal file
Binary file not shown.
@ -1,12 +1,4 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Enhanced Backdrop Node (Inherited from BaseNode)
|
||||
|
||||
Features:
|
||||
- Inherits from `BaseNode` so it can be discovered in your node scanning.
|
||||
- Custom context menu to rename (set title) or pick a new color.
|
||||
- Forces geometry updates to reduce "ghosting" or partial redraws.
|
||||
"""
|
||||
|
||||
from Qt import QtWidgets, QtGui
|
||||
from OdenGraphQt import BaseNode
|
||||
|
128
Nodes/comparison_node.py
Normal file
128
Nodes/comparison_node.py
Normal file
@ -0,0 +1,128 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Comparison Node:
|
||||
- Inputs: Two input ports ("A" and "B").
|
||||
- Output: One output port ("Result").
|
||||
- Operation: A dropdown (combo menu) to select:
|
||||
Equal (==), Not Equal (!=), Greater Than (>), Less Than (<),
|
||||
Greater Than or Equal (>=), Less Than or Equal (<=).
|
||||
- Displays the computed result in a read-only text box labeled "Result".
|
||||
"""
|
||||
|
||||
from OdenGraphQt import BaseNode
|
||||
|
||||
class ComparisonNode(BaseNode):
|
||||
__identifier__ = 'bunny-lab.io.comparison_node'
|
||||
NODE_NAME = 'Comparison Node'
|
||||
|
||||
def __init__(self):
|
||||
super(ComparisonNode, self).__init__()
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# Initialization Section:
|
||||
# - Create two input ports: A, B
|
||||
# - Create one output port: Result
|
||||
# - Add a combo box for logical operator selection
|
||||
# - Add a text input for displaying the computed result
|
||||
# ----------------------------------------------------------------------
|
||||
self.add_input('A')
|
||||
self.add_input('B')
|
||||
self.add_output('Result')
|
||||
|
||||
# Operator combo box (==, !=, >, <, >=, <=)
|
||||
self.add_combo_menu('operator', 'Operator', items=[
|
||||
'Equal (==)',
|
||||
'Not Equal (!=)',
|
||||
'Greater Than (>)',
|
||||
'Less Than (<)',
|
||||
'Greater Than or Equal (>=)',
|
||||
'Less Than or Equal (<=)'
|
||||
])
|
||||
|
||||
# Text input for displaying the computed result.
|
||||
# We'll make it read-only by accessing the underlying QLineEdit.
|
||||
self.add_text_input('calc_result', 'Result', text='0')
|
||||
result_widget = self.get_widget('calc_result') # This is a NodeLineEdit wrapper
|
||||
if result_widget:
|
||||
# Get the underlying QLineEdit
|
||||
line_edit = result_widget.get_custom_widget()
|
||||
# Make the QLineEdit read-only
|
||||
line_edit.setReadOnly(True)
|
||||
|
||||
self.value = 0
|
||||
self.set_name("Comparison Node")
|
||||
self.process_input()
|
||||
|
||||
def process_input(self, event=None):
|
||||
"""
|
||||
Compute Section:
|
||||
- For each input port (A, B), if connected, grab the 'value' from
|
||||
the upstream node; otherwise default to 0.0.
|
||||
- Convert to float when possible, apply the selected comparison operator,
|
||||
update the "Result" text box, node title, and output port.
|
||||
"""
|
||||
# Gather input A
|
||||
input_a = self.input(0)
|
||||
if input_a and input_a.connected_ports():
|
||||
a_raw = input_a.connected_ports()[0].node().get_property('value')
|
||||
else:
|
||||
a_raw = 0.0
|
||||
|
||||
# Gather input B
|
||||
input_b = self.input(1)
|
||||
if input_b and input_b.connected_ports():
|
||||
b_raw = input_b.connected_ports()[0].node().get_property('value')
|
||||
else:
|
||||
b_raw = 0.0
|
||||
|
||||
# Convert raw inputs to float if possible, otherwise keep as-is for string comparison.
|
||||
try:
|
||||
a_val = float(a_raw)
|
||||
b_val = float(b_raw)
|
||||
except (ValueError, TypeError):
|
||||
a_val = a_raw
|
||||
b_val = b_raw
|
||||
|
||||
# Retrieve the selected operator from the combo box.
|
||||
operator = self.get_property('operator')
|
||||
result = False
|
||||
|
||||
if operator == 'Equal (==)':
|
||||
result = a_val == b_val
|
||||
elif operator == 'Not Equal (!=)':
|
||||
result = a_val != b_val
|
||||
elif operator == 'Greater Than (>)':
|
||||
result = a_val > b_val
|
||||
elif operator == 'Less Than (<)':
|
||||
result = a_val < b_val
|
||||
elif operator == 'Greater Than or Equal (>=)':
|
||||
result = a_val >= b_val
|
||||
elif operator == 'Less Than or Equal (<=)':
|
||||
result = a_val <= b_val
|
||||
|
||||
# Convert boolean result to integer (1 for True, 0 for False)
|
||||
self.value = 1 if result else 0
|
||||
|
||||
# Update the read-only text input and node title.
|
||||
self.set_property('calc_result', str(self.value))
|
||||
|
||||
# Transmit the numeric result to any connected output nodes.
|
||||
output_port = self.output(0)
|
||||
if output_port and output_port.connected_ports():
|
||||
for cp in output_port.connected_ports():
|
||||
connected_node = cp.node()
|
||||
if hasattr(connected_node, 'receive_data'):
|
||||
connected_node.receive_data(self.value, source_port_name='Result')
|
||||
|
||||
def on_input_connected(self, input_port, output_port):
|
||||
self.process_input()
|
||||
|
||||
def on_input_disconnected(self, input_port, output_port):
|
||||
self.process_input()
|
||||
|
||||
def property_changed(self, property_name):
|
||||
if property_name in ['operator']:
|
||||
self.process_input()
|
||||
|
||||
def receive_data(self, data, source_port_name=None):
|
||||
self.process_input()
|
@ -36,7 +36,7 @@ def get_draw_stat_port(color, border_color=None, alpha=127):
|
||||
|
||||
class CharacterStatusNode(BaseNode):
|
||||
__identifier__ = 'bunny-lab.io.flyff_character_status_node'
|
||||
NODE_NAME = 'Character Status'
|
||||
NODE_NAME = 'Flyff - Character Status'
|
||||
|
||||
def __init__(self):
|
||||
super(CharacterStatusNode, self).__init__()
|
||||
@ -58,7 +58,7 @@ class CharacterStatusNode(BaseNode):
|
||||
self.add_output("FP: Total", painter_func=get_draw_stat_port((36, 197, 28)))
|
||||
self.add_output("EXP", painter_func=get_draw_stat_port((52, 195, 250)))
|
||||
|
||||
self.set_name("Character Status (API Disconnected)")
|
||||
self.set_name("Flyff - Character Status (API Disconnected)")
|
||||
|
||||
# Start polling timer
|
||||
self.timer = QtCore.QTimer()
|
||||
@ -95,7 +95,7 @@ class CharacterStatusNode(BaseNode):
|
||||
else:
|
||||
print(f"[WARNING] Unexpected API key: {key} (not mapped)")
|
||||
|
||||
self.set_name("Character Status (API Connected)")
|
||||
self.set_name("Flyff - Character Status (API Connected)")
|
||||
self.update()
|
||||
self.transmit_data()
|
||||
|
||||
@ -104,14 +104,14 @@ class CharacterStatusNode(BaseNode):
|
||||
print("[ERROR] Stack Trace:\n", traceback.format_exc())
|
||||
else:
|
||||
print("[ERROR] Unexpected API response format (not a dict):", data)
|
||||
self.set_name("Character Status (API Disconnected)")
|
||||
self.set_name("Flyff - Character Status (API Disconnected)")
|
||||
|
||||
else:
|
||||
print(f"[ERROR] API request failed with status code {response.status_code}")
|
||||
self.set_name("Character Status (API Disconnected)")
|
||||
self.set_name("Flyff - Character Status (API Disconnected)")
|
||||
|
||||
except Exception as e:
|
||||
self.set_name("Character Status (API Disconnected)")
|
||||
self.set_name("Flyff - Character Status (API Disconnected)")
|
||||
print("[ERROR] Error polling API in CharacterStatusNode:", str(e))
|
||||
print("[ERROR] Stack Trace:\n", traceback.format_exc())
|
||||
|
||||
|
22
Nodes/flyff_low_health_alert_node.py
Normal file
22
Nodes/flyff_low_health_alert_node.py
Normal file
@ -0,0 +1,22 @@
|
||||
from OdenGraphQt import BaseNode
|
||||
from OdenGraphQt.constants import NodePropWidgetEnum
|
||||
from OdenGraphQt.widgets.node_widgets import NodeLineEditValidatorCheckBox
|
||||
|
||||
class CheckboxNode(BaseNode):
|
||||
|
||||
# set a unique node identifier.
|
||||
__identifier__ = 'bunny-lab.io.flyff_low_health_alert_node'
|
||||
|
||||
# set the initial default node name.
|
||||
NODE_NAME = 'Flyff - Low Health Alert'
|
||||
|
||||
def __init__(self):
|
||||
super(CheckboxNode, self).__init__()
|
||||
|
||||
# Create checkboxes to decide which kind of alert(s) to utilize.
|
||||
self.add_checkbox('cb_1', '', 'Sound Alert', True)
|
||||
self.add_checkbox('cb_2', '', 'Visual Alert', True)
|
||||
|
||||
# Create Input Port
|
||||
self.add_input('Toggle (1 = On | 0 = Off)', color=(200, 100, 0))
|
||||
#self.add_output('out', color=(0, 100, 200))
|
Reference in New Issue
Block a user