import%20marimo%0A%0A__generated_with%20%3D%20%220.13.6%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20Find%20equip%20item%20spells%20with%20limited%20druation%0A%0A%20%20%20%20ref%3A%20https%3A%2F%2Fgithub.com%2Fazerothcore%2Fazerothcore-wotlk%2Fpull%2F14809%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20os%0A%20%20%20%20import%20sqlalchemy%0A%0A%20%20%20%20_password%20%3D%20os.environ.get(%22MYSQL_PASSWORD%22%2C%20%22acore%22)%0A%20%20%20%20DATABASE_URL%20%3D%20f%22mysql%2Bpymysql%3A%2F%2Facore%3A%7B_password%7D%40127.0.0.1%3A3306%2Facore_world2%22%0A%20%20%20%20engine%20%3D%20sqlalchemy.create_engine(DATABASE_URL)%0A%20%20%20%20return%20(engine%2C)%0A%0A%0A%40app.cell%0Adef%20_(engine%2C%20mo)%3A%0A%20%20%20%20df_spells%20%3D%20mo.sql(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20--%20spelltrigger%3A%20ON_EQUIP%20%3D%201%0A%20%20%20%20%20%20%20%20SELECT%20entry%20as%20item_id%2C%20spellid_1%20AS%20spell_id%0A%20%20%20%20%20%20%20%20FROM%20item_template%0A%20%20%20%20%20%20%20%20WHERE%20spellid_1%20%3E%200%20AND%20spelltrigger_1%20%3D%201%0A%0A%20%20%20%20%20%20%20%20UNION%0A%0A%20%20%20%20%20%20%20%20SELECT%20entry%20as%20item_id%2C%20spellid_2%20AS%20spell_id%0A%20%20%20%20%20%20%20%20FROM%20item_template%0A%20%20%20%20%20%20%20%20WHERE%20spellid_2%20%3E%200%20AND%20spelltrigger_2%20%3D%201%0A%0A%20%20%20%20%20%20%20%20UNION%0A%0A%20%20%20%20%20%20%20%20SELECT%20entry%20as%20item_id%2C%20spellid_3%20AS%20spell_id%0A%20%20%20%20%20%20%20%20FROM%20item_template%0A%20%20%20%20%20%20%20%20WHERE%20spellid_3%20%3E%200%20AND%20spelltrigger_3%20%3D%201%0A%0A%20%20%20%20%20%20%20%20UNION%20%0A%0A%20%20%20%20%20%20%20%20SELECT%20entry%20as%20item_id%2C%20spellid_4%20AS%20spell_id%0A%20%20%20%20%20%20%20%20FROM%20item_template%0A%20%20%20%20%20%20%20%20WHERE%20spellid_4%20%3E%200%20AND%20spelltrigger_4%20%3D%201%0A%0A%20%20%20%20%20%20%20%20UNION%20%0A%0A%20%20%20%20%20%20%20%20SELECT%20entry%20as%20item_id%2C%20spellid_5%20AS%20spell_id%0A%20%20%20%20%20%20%20%20FROM%20item_template%0A%20%20%20%20%20%20%20%20WHERE%20spellid_5%20%3E%200%20AND%20spelltrigger_5%20%3D%201%3B%0A%20%20%20%20%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20engine%3Dengine%0A%20%20%20%20)%0A%20%20%20%20return%20(df_spells%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20from%20dbcpy.dbc_file%20import%20DBCFile%0A%20%20%20%20from%20dbcpy.records.spell_record%20import%20SpellRecord%0A%20%20%20%20return%20DBCFile%2C%20SpellRecord%0A%0A%0A%40app.cell%0Adef%20_(DBCFile%2C%20SpellRecord)%3A%0A%20%20%20%20def%20_()%3A%0A%20%20%20%20%20%20%20%20dbc_path%20%3D%20%22dbc%2FSpell.dbc%22%0A%20%20%20%20%20%20%20%20spell_dbc%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20with%20open(dbc_path%2C%20'r%2Bb')%20as%20f%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20dbc_file%20%3D%20DBCFile.from_file(f%2C%20SpellRecord)%0A%20%20%20%20%20%20%20%20%20%20%20%20spells%20%3D%20dbc_file.records%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20spell%20in%20spells%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20spell_dbc.append(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'entry'%3A%20spell.entry%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'name'%3A%20spell.name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'duration_index'%3A%20spell.duration_index%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%0A%20%20%20%20%20%20%20%20return%20spell_dbc%0A%20%20%20%20spell_dbc%20%3D%20_()%0A%0A%20%20%20%20return%20(spell_dbc%2C)%0A%0A%0A%40app.cell%0Adef%20_(df_spells%2C%20spell_dbc)%3A%0A%20%20%20%20for%20spell_id%20in%20df_spells%5B'spell_id'%5D.values%3A%0A%20%20%20%20%20%20%20%20duration_index%20%3D%20None%0A%20%20%20%20%20%20%20%20for%20spell_dbc_item%20in%20spell_dbc%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20spell_id%20%3D%3D%20spell_dbc_item%5B'entry'%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20duration_index%20%3D%20spell_dbc_item%5B'duration_index'%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20df_spells.loc%5Bdf_spells.spell_id%20%3D%3D%20spell_id%2C%20'duration_index'%5D%20%3D%20duration_index%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(df_spells)%3A%0A%20%20%20%20df_spells.head()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(df_spells)%3A%0A%20%20%20%20%23%20Remove%20spells%20with%20no%20duration%20(0)%20or%20infinite%20duration%20(21).%20See%20SpellDuration.dbc%0A%20%20%20%20df_spells_limited_duration%20%3D%20df_spells%5B%0A%20%20%20%20%20%20%20%20(df_spells%5B'duration_index'%5D%20!%3D%200)%20%26%20(df_spells%5B'duration_index'%5D%20!%3D%2021)%0A%20%20%20%20%5D%0A%20%20%20%20return%20(df_spells_limited_duration%2C)%0A%0A%0A%40app.cell%0Adef%20_(df_spells_limited_duration)%3A%0A%20%20%20%20df_spells_limited_duration%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(df_spells_limited_duration)%3A%0A%20%20%20%20fmt_spells_with_no_duration_index%20%3D%20%22%2C%20%22.join(str(id)%20for%20id%20in%20df_spells_limited_duration%5B'spell_id'%5D.unique())%0A%20%20%20%20return%20(fmt_spells_with_no_duration_index%2C)%0A%0A%0A%40app.cell%0Adef%20_(engine%2C%20fmt_spells_with_no_duration_index%2C%20mo)%3A%0A%20%20%20%20df_spells_serverside%20%3D%20mo.sql(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20SELECT%20ID%2C%20DurationIndex%20FROM%20spell_dbc%20WHERE%20ID%20IN%20(%7Bfmt_spells_with_no_duration_index%7D)%3B%0A%20%20%20%20%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20engine%3Dengine%0A%20%20%20%20)%0A%20%20%20%20return%20(df_spells_serverside%2C)%0A%0A%0A%40app.cell%0Adef%20_(engine%2C%20fmt_spells_with_no_duration_index%2C%20mo)%3A%0A%20%20%20%20df_disables_spells%20%3D%20mo.sql(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20SELECT%20entry%20FROM%20disables%20WHERE%20(flags%20%26%208)%20AND%20entry%20IN%20(%7Bfmt_spells_with_no_duration_index%7D)%3B%0A%20%20%20%20%20%20%20%20%22%22%22%2C%0A%20%20%20%20%20%20%20%20engine%3Dengine%0A%20%20%20%20)%0A%20%20%20%20return%20(df_disables_spells%2C)%0A%0A%0A%40app.cell%0Adef%20_(df_disables_spells%2C%20df_spells_limited_duration%2C%20df_spells_serverside)%3A%0A%20%20%20%20%23%20list%20spells%20with%20limited%20duration%20that%20are%20not%20disabled%20or%20not%20serverside%0A%20%20%20%20df_spells_limited_duration_not_disabled_or_not_serverside%20%3D%20df_spells_limited_duration%5B%0A%20%20%20%20%20%20%20%20~df_spells_limited_duration%5B'spell_id'%5D.isin(df_spells_serverside%5B'ID'%5D)%20%26%20~df_spells_limited_duration%5B'spell_id'%5D.isin(df_disables_spells%5B'entry'%5D)%0A%20%20%20%20%5D%0A%0A%20%20%20%20print(df_spells_limited_duration_not_disabled_or_not_serverside)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20%23%209%3A%2030000%20%3D%2030%20seconds%0A%20%20%20%20%23%20548%3A%2010800000%20%3D%203%20hours%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
87aaaa82574d8b333a2fda9de22e83f932cb12997ef635eb7c3c397740d5c218