Faits :
A.
Par jugement du 16 avril 2018, le Tribunal de police des Montagnes et du Val-de-Ruz a condamné X._, pour infractions aux art. 19 al. 1 et 2 ainsi que 19a LStup, lésions corporelles simples, dommages à la propriété, menaces, blanchiment d'argent et infraction à l'art. 33 LArm, à une peine privative de liberté de 20 mois, peine partiellement complémentaire à celles prononcées les 6 mai 2013, 10 juin 2014, 23 juillet 2014 et 2 septembre 2015.
B.
Par jugement du 20 décembre 2018, la Cour pénale du Tribunal cantonal de la République et canton de Neuchâtel a rejeté l'appel formé par X._ contre ce jugement. Il a rectifié le dispositif du jugement du 16 avril 2018 en ce sens que le prénommé est condamné, pour blanchiment d'argent, non sur la base de l'art. 305ter CP mais en vertu de l'art. 305bis CP.
La cour cantonale a retenu les faits suivants.
B.a. Entre septembre 2013 et fin mars 2016, notamment à A._ et à B._, X._ a acquis et vendu à divers individus au moins 372,5 g d'héroïne, 29 g de cocaïne et 0,5 g de "crystal". Il a en outre offert à plusieurs tiers de les fournir en substances stupéfiantes et a lui-même consommé une quantité indéterminée de cocaïne, de marijuana, d'héroïne et de "crystal".
B.b. Du 1er janvier 2015 au 4 avril 2016, le prénommé a dissimulé la provenance de l'argent obtenu grâce au trafic de stupéfiants auquel il s'adonnait. Il a effectué divers dépôts et de multiples retraits auprès de sa banque.
B.c. Le 18 mars 2016, à B._, X._ a menacé C._ et D._, en brandissant devant eux un couteau. Il a frappé le dernier nommé à l'aide d'un tel objet, lui occasionnant une lésion ouverte au pouce. Il a en outre brisé la vitre du véhicule de C._.
B.d. Entre le 18 mars et le 29 août 2016, à A._ ou à B._, X._ a acquis un appareil produisant des électrochocs, de type "taser", sans être au bénéfice d'une autorisation.
C.
X._ forme un recours en matière pénale au Tribunal fédéral contre le jugement du 20 décembre 2018, en concluant, avec suite de frais et dépens, principalement à sa réforme en ce sens qu'il est libéré des chefs de prévention d'infractions aux art. 19 al. 1 et 2 LStup, 305bis, 123 et 180 CP, qu'il est condamné, pour infractions aux art. 144 CP et 33 LArm, à une peine pécuniaire n'excédant pas 20 jours, qu'il est indemnisé à raison de 200 fr. par jour de détention injustifiée, et que les objets séquestrés - à l'exception du "taser" - lui sont restitués. Subsidiairement, il conclut à son annulation et au renvoi de la cause à l'autorité précédente pour nouvelle décision. Il sollicite par ailleurs le bénéfice de l'assistance judiciaire.
Considérant en droit :
1.
Le recourant reproche à la cour cantonale d'avoir rectifié le dispositif du jugement de première instance en ce sens qu'il était condamné non pour infraction à l'art. 305ter CP mais pour infraction à l'art. 305bis CP.
1.1. A cet égard, la cour cantonale a exposé que l'acte d'accusation reprochait au recourant d'avoir commis un "blanchiment d'argent au sens de l'art. 305ter al. 2 CP" et que le tribunal de première instance avait indiqué que celui-ci s'était rendu coupable de "blanchiment d'argent du 12 janvier 2015 au 2 mars 2016", bien qu'il eût mentionné l'art. 305ter CP dans son dispositif. Selon l'autorité précédente, les agissements décrits dans l'acte d'accusation et retenus par le tribunal de première instance correspondaient de toute évidence à des actes de blanchiment d'argent, de sorte que la référence à l'art. 305ter CP résultait d'une erreur. Le recourant ne s'y était pas trompé et s'était défendu, sur le fond, contre une accusation de blanchiment d'argent. L'autorité précédente a ainsi considéré que la mention de l'art. 305ter CP dans le dispositif du jugement de première instance constituait une simple erreur de plume qu'il convenait de rectifier.
1.2. Selon le recourant, l'autorité précédente aurait, en procédant à la rectification litigieuse, violé l'interdiction de la reformatio in peius.
Certes, comme le relève le recourant, le Tribunal fédéral a eu l'occasion d'indiquer dans sa jurisprudence que, pour déterminer si l'on se trouve en présence d'une reformatio in peius prohibée, il convient de se référer au dispositif du dernier arrêt en cause, lequel ne doit pas avoir été modifié en défaveur du prévenu par le biais d'un verdict de culpabilité plus sévère ou par le prononcé d'une peine plus lourde que ceux résultant du dispositif de l'arrêt préalablement querellé (cf. ATF 144 IV 35 consid. 3.1.1 p. 44 et les références citées). Cependant, le dispositif d'un jugement doit se comprendre à la lumière des considérants de la décision et ne constitue qu'une partie du prononcé de clôture au sens de l'art. 81 al. 1 CPP (cf. ATF 143 IV 469 consid. 4.2.2 p. 474). En l'occurrence, il ressortait bien du jugement de première instance - pris dans son ensemble - que le recourant avait été condamné pour blanchiment d'argent au sens de l'art. 305biset non pour infraction à l'art. 305ter CP. La cour cantonale n'a pas aggravé la peine infligée à celui-ci ni la qualification juridique des faits qui lui étaient reprochés (cf. ATF 144 IV 35 consid. 3.1.1 p. 43), puisqu'elle a retenu la même infraction déjà retenue à sa charge par le tribunal de première instance. Partant, la rectification opérée n'était aucunement contraire à l'art. 391 al. 2 CPP. On ajoutera que le recourant n'a pas d'intérêt juridiquement protégé à se prévaloir d'une erreur de plume afin que soit inscrite, dans son casier judiciaire, une infraction pour laquelle il n'a en réalité jamais été condamné, au détriment d'une autre dont il a au contraire été reconnu coupable.
1.3. Le recourant soutient encore que la cour cantonale aurait violé l'art. 83 CPP en procédant elle-même à la rectification litigieuse.
Aux termes de cette disposition, l'autorité pénale qui a rendu un prononcé dont le dispositif est peu clair, contradictoire ou incomplet ou qui est en contradiction avec l'exposé des motifs, l'explique ou le rectifie à la demande d'une partie ou d'office (al. 1). La demande est présentée par écrit et indique les passages contestés et, le cas échéant, les modifications souhaitées (al. 2). L'autorité pénale donne aux autres parties l'occasion de se prononcer sur la demande (al. 3). Les demandes en interprétation et en rectification d'une décision ne sont soumises à aucun délai; elles ne peuvent avoir pour objet la modification de son contenu matériel, mais doivent être limitées à sa clarification, respectivement à la correction d'inadvertances manifestes (arrêts 6B_491/2015 du 17 mars 2016 consid. 2.1; 6B_727/2012 du 11 mars 2013 consid. 4.2.1).
Le recourant prétend que seul le tribunal de première instance aurait pu procéder à une rectification du dispositif, de sorte que la cour cantonale aurait dû, après avoir constaté l'erreur de plume relative à l'art. 305ter CP, suspendre la procédure d'appel afin de laisser à celui-ci la possibilité de le faire.
Une telle manière de procéder ne se justifiait pas. En effet, la règle découlant de l'art. 83 al. 1 CPP, selon laquelle l'autorité pénale qui a rendu le prononcé concerné est compétente pour procéder à son explication ou à sa rectification, se comprend dans la mesure où, dans une partie des cas visés par cette disposition, cette autorité devra expliquer ou clarifier ce qu'elle a entendu dire. S'agissant d'une inadvertance manifeste, qui ne relève en rien de l'interprétation, rien n'empêche l'autorité de recours, qui constate une telle inadvertance, de procéder elle-même à une rectification d'office (cf. ALAIN MACALUSO, in Commentaire romand, Code de procédure pénale suisse, 2011, no 6 ad art. 83 CPP). La possibilité d'expliquer ou de rectifier des prononcés accordée aux autorités pénales par l'art. 83 CPP vise d'ailleurs à remédier à des carences de manière simple, sans passer par une procédure de recours (cf. Message du 21 décembre 2005 relatif à l'unification du droit de la procédure pénale, FF 2006 1135 ad art. 81). De ce point de vue, une suspension de la procédure de recours ou d'appel ainsi qu'un renvoi de la cause à l'autorité précédente afin que celle-ci puisse rectifier une simple erreur de plume seraient contraires au but de la disposition.
Contrairement à ce que suggère le recourant, aucun délai ne limite la possibilité de rectifier un prononcé. En l'occurrence, la cour cantonale a procédé à une telle rectification d'office, non sur demande, de sorte qu'on ne voit pas en quoi une inaction du ministère public - lequel semble au demeurant se trouver à l'origine de l'erreur de plume reprise par le tribunal de première instance - durant le délai d'appel ou le délai d'appel joint aurait exclu une telle opération de la part de l'autorité précédente.
Enfin, l'argumentation du recourant concernant une prétendue violation de l'art. 83 al. 3 CPP par la cour cantonale tombe à faux. La rectification litigieuse n'est pas intervenue sur demande, mais d'office. Pour le reste, il apparaît que la problématique liée à la mention erronée de l'art. 305 ter CP dans le dispositif du jugement de première instance a été directement évoquée par le recourant, si bien que ce dernier s'est exprimé sur ce point. La cour cantonale n'a aucunement porté atteinte à son droit d'être entendu en procédant, par la suite, d'office à la rectification nécessaire.
Compte tenu de ce qui précède, le grief doit être rejeté.
2.
Le recourant reproche à l'autorité précédente d'avoir refusé d'administrer les preuves requises.
2.1. Selon l'art. 389 al. 1 CPP, la procédure de recours se fonde sur les preuves administrées pendant la procédure préliminaire et la procédure de première instance. L'art. 389 al. 3 CPP règle les preuves complémentaires. Ainsi, la juridiction de recours administre, d'office ou à la demande d'une partie, les preuves complémentaires nécessaires au traitement du recours. Le droit d'être entendu, consacré par l'art. 107 CPP, garantit aux parties le droit de déposer des propositions relatives aux moyens de preuves (al. 1 let. e). Conformément à l'art. 139 al. 2 CPP, il n'y a pas lieu d'administrer des preuves sur des faits non pertinents, notoires, connus de l'autorité ou déjà suffisamment prouvés. Cette disposition codifie, pour la procédure pénale, la règle jurisprudentielle déduite de l'art. 29 al. 2 Cst. en matière d'appréciation anticipée des preuves (arrêts 6B_1280/2018 du 20 mars 2019 consid. 1.1; 6B_1025/2018 du 12 mars 2019 consid. 2.2). Le refus d'instruire ne viole ainsi le droit d'être entendu des parties que si l'appréciation anticipée de la pertinence du moyen de preuve offert, à laquelle le juge a procédé, est entachée d'arbitraire (ATF 141 I 60 consid. 3.3 p. 64; 136 I 229 consid. 5.3 p. 236).
Aux termes de l'art. 343 al. 3 CPP - applicable aux débats d'appel par renvoi de l'art. 405 al. 1 CPP -, le tribunal réitère l'administration des preuves qui, lors de la procédure préliminaire, ont été administrées en bonne et due forme, lorsque la connaissance directe du moyen de preuve apparaît nécessaire au prononcé du jugement (cf. ATF 143 IV 288 consid. 1.4.1 p. 290). La connaissance directe d'un moyen de preuve n'est nécessaire que lorsque celle-ci est susceptible d'influer sur le sort de la procédure, ce qui est le cas si la force du moyen de preuve dépend de manière décisive de l'impression suscitée au moment de sa présentation, notamment quand des déclarations constituent l'unique moyen de preuve - à défaut de tout autre indice - et qu'il existe une situation de "déclarations contre déclarations" (cf. ATF 140 IV 196 consid. 4.4.2 p. 199 s.; arrêt 6B_1266/2018 du 12 mars 2019 consid. 1.2). Le juge dispose d'un pouvoir d'appréciation afin de déterminer que moyen de preuve doit être à nouveau administré (ATF 140 IV 196 consid. 4.4.2 p. 199 s.; arrêt 6B_1266/2018 précité consid. 1.2).
2.2. Dans une ordonnance du 18 juin 2018, la cour cantonale a exposé que le recourant avait demandé l'audition des dix personnes mentionnées dans l'acte d'accusation comme ayant acquis des stupéfiants auprès de lui. L'intéressé admettait que celles-ci avaient été entendues en bonne et due forme durant la procédure préliminaire, mais considérait que leurs déclarations constituaient les seules preuves à charge concernant le trafic de stupéfiants et que la cour cantonale devait auditionner ces individus directement. Selon la cour cantonale, les déclarations des dix personnes concernées ne constituaient pas les seuls indices pointant l'existence d'un trafic de stupéfiants. En particulier, le recourant avait épargné près de 10'000 fr. en 14 mois alors qu'il émargeait à l'assistance sociale. L'impression immédiate obtenue par une audition directe des dix clients ne pouvait donc influencer de manière décisive le sort de la cause. Dans le jugement attaqué, l'autorité précédente a ajouté qu'il ne s'agissait pas d'une situation de "déclarations contre déclarations" au sens de la jurisprudence, puisque les dénégations du recourant s'opposaient aux mises en cause de dix personnes différentes. Elle a également indiqué que les déclarations litigieuses avaient été corroborées par d'autres indices importants. Ainsi, le recourant détenait 11 cartes SIM lors de son arrestation et avait changé de numéro téléphonique à plusieurs reprises, ce qui était caractéristique des trafiquants de stupéfiants. Il avait échangé, avec ses clients, des SMS laissant transparaître l'existence du trafic et avait entretenu des contacts téléphoniques sans avoir eu d'autres motifs que la vente de stupéfiants pour ce faire. La police avait en outre saisi un couteau portant des traces d'héroïne au domicile du recourant. Un voisin de ce dernier avait enfin déclaré à la police qu'"énormément de monde" se présentait chez l'intéressé, sonnant puis repartant, surtout le soir.
2.3. Le recourant évoque tout d'abord son droit à être confronté aux témoins à charge. Il ne conteste toutefois pas les constatations de la cour cantonale selon lesquelles les clients concernés ont été auditionnés en présence de son défenseur ou après que ce dernier eut expressément renoncé à être présent. Il ne nie pas davantage avoir été - devant le ministère public - directement confronté aux clients qui le mettaient en cause pour les quantités de stupéfiants les plus importantes, en présence de son défenseur. Ainsi, pour autant que le recourant suggère que le droit à la confrontation pourrait être invoqué plusieurs fois durant la même procédure, il prête à la jurisprudence développée en la matière (cf. ATF 131 I 476 consid. 2.2 p. 480; arrêt 6B_1266/2018 précité consid. 1.7.1) une portée qu'elle n'a pas.
Le recourant reproche ensuite à la cour cantonale d'avoir considéré qu'il ne s'agissait pas, en l'occurrence, d'une situation de "déclarations contre déclarations", puisque chaque client ne s'est exprimé que sur sa propre consommation et n'a pas corroboré les déclarations des autres. Toutefois, contrairement à ce que soutient l'intéressé, on ne se trouve nullement dans une telle situation. La cour cantonale a notamment fondé sa conviction sur divers éléments probatoires - comme les revenus inexplicables du recourant, la présence de traces d'héroïne à son domicile, ses contacts téléphoniques, ses échanges de SMS suspects ou sa propension à changer de numéro de téléphone - dont celui-ci tente de minimiser la portée. Ensuite, il n'apparaît pas que l'impression laissée par les déclarations d'un client en particulier aurait pu se révéler décisive pour le sort de la cause, puisque dix personnes mettaient en cause le recourant. L'autorité précédente pouvait dès lors considérer que ces diverses mises en cause confirmaient l'existence d'un trafic de stupéfiants, indépendamment de l'impression qu'aurait pu laisser l'interrogatoire direct de l'une ou l'autre des personnes concernées (cf. dans le même sens l'arrêt 6B_69/2018 du 11 juin 2018 consid. 1.2). C'est donc à bon droit, sans violation du droit d'être entendu du recourant ni arbitraire, que la cour cantonale a refusé d'auditionner les dix clients en question durant les débats d'appel. Pour le reste, le recourant n'expose pas en quoi les art. 29 et 32 Cst. ainsi que 6 CEDH, dont il se prévaut, pourraient avoir une portée plus large que les garanties reconnues par la jurisprudence précitée en la matière. Le grief doit être rejeté.
3.
Le recourant reproche à la cour cantonale de ne pas l'avoir suffisamment interrogé sur sa personne, l'accusation et les résultats de la procédure préliminaire durant les débats d'appel.
3.1. Selon l'art. 341 al. 3 CPP, applicable à la procédure d'appel par renvoi de l'art. 405 al. 1 CPP, au début de la procédure probatoire, la direction de la procédure interroge le prévenu de façon détaillée sur sa personne, sur l'accusation et sur les résultats de la procédure préliminaire. Le fait que le prévenu eût déjà été interrogé, dans le cadre de la procédure de première instance, sur sa personne et sur l'accusation, ne rend pas son audition superflue lors de la procédure orale d'appel. D'une part, même s'il figure dans une section intitulée "procédure probatoire", l'art. 341 al. 3 CPP ne sert pas exclusivement à des fins de preuves, mais prend également en considération la position du prévenu. Il garantit à ce dernier un droit personnel de participation dans la procédure pénale conduite à son encontre, en tant que composante du droit d'être entendu, et empêche que le prévenu ne soit réduit à être l'objet de l'activité de l'Etat. D'autre part, l'interrogatoire du prévenu revêt une importance particulière s'agissant de la preuve de la culpabilité et du prononcé de la peine. L'intensité de l'interrogatoire dépend en particulier du degré de gravité de l'acte d'accusation ainsi que de l'ensemble des preuves. Dans la mesure où le prévenu a déjà été interrogé sur l'accusation lors de la procédure de première instance, il n'est pas nécessaire de l'interroger de façon aussi détaillée au cours des débats d'appel. Ainsi, l'art. 389 CPP ne conduit pas à renoncer à l'interrogatoire du prévenu lors des débats d'appel, mais relativise néanmoins la manière et l'ampleur de l'interrogatoire, dans la mesure où celui-ci ne doit porter que sur les points contestés et où les dépositions déjà recueillies - conformes au droit de procédure - demeurent utilisables (ATF 143 IV 288 consid. 1.4.2 p. 291 s.; arrêt 6B_903/2018 du 14 décembre 2018 consid. 3.1 non publié aux ATF 144 IV 383). Il appartient à la direction de la procédure de donner au prévenu la possibilité de s'exprimer sur les accusations portées contre lui et de faire valoir les circonstances qui pourraient servir sa défense ainsi que la clarification de l'état de fait. Le fait que la défense ne demande pas l'interrogatoire du prévenu durant les débats d'appel n'y change rien, car il appartient à l'autorité d'appel de garantir d'office une administration des preuves conforme à la loi. Les parties n'ont pas à pallier, par des questions, une absence d'interrogatoire par l'autorité d'appel (ATF 143 IV 288 consid. 1.4.3 p. 292; arrêt 6B_903/2018 du 14 décembre 2018 consid. 3.1 non publié aux ATF 144 IV 383). Cette dernière ne peut en principe renoncer à interroger le prévenu que lorsque l'état de fait est incontesté et ne fait pas l'objet du recours (ATF 143 IV 288 consid. 1.4.4 p. 293; arrêt 6B_1266/2018 précité consid. 2.1 et les références citées).
3.2. Au cours des débats de première instance, le recourant a été interrogé sur sa situation personnelle, ainsi que - succinctement - sur sa mise en cause concernant un trafic de stupéfiants (cf. pièces 1574 s. du dossier cantonal).
Selon le jugement attaqué, le recourant a - dans le cadre de son appel - contesté s'être livré à un trafic de stupéfiants. Il a en outre contesté que les événements du 18 mars 2016 se fussent déroulés comme l'avait retenu le tribunal de première instance.
Durant les débats d'appel, le recourant a été interrogé sur les sommes d'argent déposées sur son compte bancaire, soit à propos des aspects relatifs au chef de prévention de blanchiment d'argent. Son défenseur l'a ensuite interrogé sur les événements du 18 mars 2016, ainsi que sur sa situation personnelle.
3.3. Au vu de ce qui précède, le recourant a bien été invité à s'exprimer concernant les infractions de blanchiment d'argent ainsi que sur les agissements qui lui étaient reprochés s'agissant de l'altercation du 18 mars 2016. Il a également pu s'exprimer à propos de sa situation personnelle. A cet égard, il convient de relever que si les parties n'ont pas à pallier, par des questions, une absence d'interrogatoire par l'autorité d'appel (cf. consid. 3.1 supra), le fait que le recourant eût été interrogé par son défenseur concernant une partie des éléments contestés a bien permis à l'intéressé de s'exprimer et de faire valoir ses explications en la matière.
En revanche, force est de constater que le recourant n'a aucunement été interrogé à propos du trafic de stupéfiants lors des débats d'appel, alors qu'il contestait les faits qui lui étaient reprochés à cet égard. En outre, ces agissements, qui constituaient pourtant un aspect essentiel de l'accusation, n'avaient été que brièvement évoqués durant les débats de première instance. Certes, dès lors que le recourant avait été condamné par le tribunal de première instance et que la cour cantonale a retenu les mêmes faits sur ce point, l'autorité précédente pouvait largement s'appuyer sur les éléments de preuve administrés précédemment et limiter son interrogatoire en conséquence (cf. a contrario l'arrêt 6B_308/2018 du 23 juillet 2018 consid. 3.3). Elle ne pouvait toutefois se dispenser totalement de questionner le recourant concernant ces faits.
Compte tenu de ce qui précède, le recours doit être admis, le jugement attaqué annulé et la cause renvoyée à l'autorité cantonale afin qu'elle conduise de nouveaux débats d'appel conformes au droit fédéral, soit en interrogeant le recourant sur l'accusation relative au trafic de stupéfiants ainsi que sur les résultats de la procédure préliminaire et de la procédure de première instance à cet égard, avant de rendre une nouvelle décision. Conformément à l'art. 389 CPP, il appartiendra à l'autorité cantonale de déterminer l'ampleur que devra revêtir l'interrogatoire, au regard des preuves administrées pendant la procédure préliminaire et la procédure de première instance (cf. arrêt 6B_308/2018 précité consid. 3.3).
4.
Dès lors que le jugement attaqué doit être annulé et la cause renvoyée à l'autorité cantonale afin que celle-ci tienne de nouveaux débats (cf. consid. 3.3 supra), le Tribunal fédéral peut se dispenser, à ce stade, de traiter le grief du recourant concernant la fixation de la peine.
5.
Le recours doit être partiellement admis (cf. consid. 3.3 supra). Pour le reste, le recours doit être rejeté. Le recourant, qui n'obtient que partiellement gain de cause, supporte une partie des frais judiciaires (art. 66 al. 1 LTF). Il peut prétendre à des dépens réduits, à la charge du canton de Neuchâtel (art. 68 al. 1 LTF). Sa demande d'assistance judiciaire est sans objet dans la mesure où le recourant a droit à des dépens; elle doit être rejetée pour le reste, dès lors que le recours était dénué de chances de succès s'agissant des aspects sur lesquels le recourant a succombé (art. 64 al. 1 LTF).
L'admission du recours découlant de l'existence d'un vice procédural, il peut être statué sans qu'il soit nécessaire de procéder à un échange d'écritures préalable.
Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est partiellement admis, le jugement attaqué est annulé et la cause est renvoyée à l'autorité cantonale pour nouvelle décision. Pour le surplus, le recours est rejeté.
2.
La demande d'assistance judiciaire est rejetée dans la mesure où elle n'est pas sans objet.
3.
Une partie des frais judiciaires, arrêtée à 800 fr., est mise à la charge du recourant.
4.
Le canton de Neuchâtel versera au recourant une indemnité de 1'000 fr. à titre de dépens réduits pour la procédure devant le Tribunal fédéral.
5.
Le présent arrêt est communiqué aux parties et à la Cour pénale du Tribunal cantonal du canton de Neuchâtel.
Lausanne, le 29 mars 2019
Au nom de la Cour de droit pénal
du Tribunal fédéral suisse
Le Président : Denys
Le Greffier : Graa